@@ -61,10 +61,37 @@ module Prelude where
61 read "true" = true
61 read "true" = true
62 read _ = false
62 read _ = false
66+ class Functor f where
67+ (<$>) :: forall a b. (a -> b) -> f a -> f b
71+ class Applicative f where
72+ pure :: forall a. a -> f a
73+ (<*>) :: forall a b. f (a -> b) -> f a -> f b
75+ instance (Applicative f) => Functor f where
76+ (<$>) f a = pure f <*> a
80+ class Alternative f where
81+ empty :: forall a. f a
82+ (<|>) :: forall a. f a -> f a -> f a
64 class Monad m where
84 class Monad m where
65 ret :: forall a. a -> m a
85 ret :: forall a. a -> m a
66 (>>=) :: forall a b. m a -> (a -> m b) -> m b
86 (>>=) :: forall a b. m a -> (a -> m b) -> m b
88+ instance (Monad m) => Applicative m where
68 infixl 5 *
95 infixl 5 *
69 infixl 5 /
96 infixl 5 /
70 infixl 5 %
97 infixl 5 %
@@ -326,6 +353,74 @@ module Prelude where
327 \}" :: String -> String -> String
354 \}" :: String -> String -> String
362+ class Monoid m where
366+ instance Monoid String where
370+ mconcat :: forall m. (Monoid m) => [m] -> m
372+ mconcat (m:ms) = m <> mconcat ms
379+ replicateM :: forall m a. (Monad m) => Number -> m a -> m [a]
380+ replicateM 0 _ = ret []
383+ as <- replicateM (n - 1) m
386+ mapM :: forall m a b. (Monad m) => (a -> m b) -> [a] -> m [b]
396+ (>=>) :: forall m a b c. (Monad m) => (a -> m b) -> (b -> m c) -> a -> m c
401+ (<=<) :: forall m a b c. (Monad m) => (b -> m c) -> (a -> m b) -> a -> m c
404+ sequence :: forall m a. (Monad m) => [m a] -> m [a]
405+ sequence [] = ret []
406+ sequence (m:ms) = do
411+ join :: forall m a. (Monad m) => m (m a) -> m a
416+ foldM :: forall m a b. (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
417+ foldM _ a [] = ret a
418+ foldM f a (b:bs) = f a b >>= \a' -> foldM f a' bs
420+ when :: forall m. (Monad m) => Boolean -> m {} -> m {}
422+ when false _ = ret {}
329module Maybe where
424module Maybe where
331 import Prelude
426 import Prelude
@@ -408,9 +503,9 @@ module Arrays where
409 \}" :: forall a. [a] -> [a] -> [a]
504 \}" :: forall a. [a] -> [a] -> [a]
411− foreign import join "function join(l) {\
506+ foreign import joinS "function joinS(l) {\
412− \ return l.join();\
507+ \ return l.join();\
413− \}" :: [String] -> String
508+ \}" :: [String] -> String
415 foreign import joinWith "function joinWith(l) {\
510 foreign import joinWith "function joinWith(l) {\
416 \ return function (s) {\
511 \ return function (s) {\
@@ -467,6 +562,9 @@ module Arrays where
467 (:) :: forall a. a -> [a] -> [a]
562 (:) :: forall a. a -> [a] -> [a]
468 (:) a = concat [a]
563 (:) a = concat [a]
565+ singleton :: forall a. a -> [a]
470 concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
568 concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
471 concatMap [] f = []
569 concatMap [] f = []
472 concatMap (a:as) f = f a `concat` concatMap as f
570 concatMap (a:as) f = f a `concat` concatMap as f
@@ -476,9 +574,9 @@ module Arrays where
476 filter p (x:xs) | p x = x : filter p xs
574 filter p (x:xs) | p x = x : filter p xs
477 filter p (_:xs) = filter p xs
575 filter p (_:xs) = filter p xs
479− empty :: forall a. [a] -> Boolean
577+ isEmpty :: forall a. [a] -> Boolean
480− empty [] = true
578+ isEmpty [] = true
481− empty _ = false
579+ isEmpty _ = false
483 range :: Number -> Number -> [Number]
581 range :: Number -> Number -> [Number]
484 range lo hi = {
582 range lo hi = {
@@ -505,6 +603,14 @@ module Arrays where
505 show [] = "[]"
603 show [] = "[]"
506 show (x:xs) = show x ++ " : " ++ show xs
604 show (x:xs) = show x ++ " : " ++ show xs
606+ instance Prelude.Monad [] where
610+ instance Prelude.Alternative [] where
508module Tuple where
614module Tuple where
510 import Prelude
616 import Prelude
@@ -783,6 +889,46 @@ module Eff where
783 ret = retEff
889 ret = retEff
784 (>>=) = bindEff
890 (>>=) = bindEff
892+ foreign import untilE "function untilE(f) {\
893+ \ return function() {\
897+ \}" :: forall e. Eff e Boolean -> Eff e {}
899+ foreign import whileE "function whileE(f) {\
900+ \ return function(a) {\
901+ \ return function() {\
908+ \}" :: forall e. Eff e Boolean -> Eff e {} -> Eff e {}
910+ foreign import forE "function forE(lo) {\
911+ \ return function(hi) {\
912+ \ return function(f) {\
913+ \ return function() {\
914+ \ for (var i = lo; i < hi; i++) {\
920+ \}" :: forall e. Number -> Number -> (Number -> Eff e {}) -> Eff e {}
923+ foreign import foreachE "function foreachE(as) {\
924+ \ return function(f) {\
925+ \ for (var i = 0; i < as.length; i++) {\
929+ \}" :: forall e a. [a] -> (a -> Eff e {}) -> Eff e {}
786module Random where
932module Random where
788 import Eff
934 import Eff