38 lines
1.2 KiB
Text
38 lines
1.2 KiB
Text
/-
|
||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura, Sebastian Ullrich
|
||
-/
|
||
prelude
|
||
import init.category.functor
|
||
open function
|
||
universes u v
|
||
|
||
class applicative (f : Type u → Type v) extends functor f :=
|
||
(pure : Π {α : Type u}, α → f α)
|
||
(seq : Π {α β : Type u}, f (α → β) → f α → f β)
|
||
(seq_left : Π {α β : Type u}, f α → f β → f α := λ α β a b, seq (map (const β) a) b)
|
||
(seq_right : Π {α β : Type u}, f α → f β → f β := λ α β a b, seq (map (const α id) a) b)
|
||
(map := λ _ _ x y, seq (pure x) y)
|
||
|
||
section
|
||
variables {f : Type u → Type v} [applicative f] {α β : Type u}
|
||
|
||
@[inline] def pure : α → f α :=
|
||
applicative.pure f
|
||
|
||
@[inline] def seq_app : f (α → β) → f α → f β :=
|
||
applicative.seq
|
||
|
||
/-- Sequence actions, discarding the first value. -/
|
||
@[inline] def seq_left : f α → f β → f α :=
|
||
applicative.seq_left
|
||
|
||
/-- Sequence actions, discarding the second value. -/
|
||
@[inline] def seq_right : f α → f β → f β :=
|
||
applicative.seq_right
|
||
|
||
infixl ` <*> `:2 := seq_app
|
||
infixl ` <* `:2 := seq_left
|
||
infixl ` *> `:2 := seq_right
|
||
end
|