@@ -9,6 +9,37 @@ infixl 2 <$>
99
1010class Functor f => Applicative (f : Type -> Type) where
1111 pure : a -> f a
12− (<$>) : f (a -> b) -> f a -> f b
12+ (<$>) : f (a -> b) -> f a -> f b
1313
14+infixl 2 <$
15+(<$) : Applicative f => f a -> f b -> f a
16+a <$ b = fmap const a <$> b
1417
18+infixl 2 $>
19+($>) : Applicative f => f a -> f b -> f b
20+a $> b = fmap (const id) a <$> b
21+
22+infixl 3 <|>
23+class Applicative f => Alternative (f : Type -> Type) where
24+ empty : f a
25+ (<|>) : f a -> f a -> f a
26+
27+guard : Alternative f => Bool -> f ()
28+guard a = if a then pure () else empty
29+
30+when : Applicative f => Bool -> f () -> f ()
31+when a f = if a then f else pure ()
32+
33+sequence : Applicative f => List (f a) -> f (List a)
34+sequence [] = pure []
35+sequence (x :: xs) = fmap (::) x <$> sequence xs
36+
37+sequence_ : Applicative f => List (f a) -> f ()
38+sequence_ [] = pure ()
39+sequence_ (x :: xs) = x $> sequence_ xs
40+
41+traverse : Applicative f => (a -> f b) -> List a -> f (List b)
42+traverse f xs = sequence (map f xs)
43+
44+traverse_ : Applicative f => (a -> f b) -> List a -> f ()
45+traverse_ f (x :: xs) = f x $> traverse_ f xs