@@ -67,20 +67,17 @@ module Arrays where
6767 tailSafe (_ : xs) = Just xs
6868 tailSafe _ = Nothing
6969
70− foreign import map :: forall a b. (a -> b) -> [a] -> [b]
70+ map :: forall a b. (a -> b) -> [a] -> [b]
71+ map _ [] = []
72+ map f (x:xs) = f x : map f xs
7173
7274 foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
7375 foldr f a (b : bs) = f (foldr f a bs) b
7476 foldr _ a [] = a
7577
7678 foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
77− foldl f b as = {
78− var result = b;
79− foreach (a in as) {
80− result = f a result;
81− }
82− return result;
83− }
79+ foldl _ b [] = b
80+ foldl f b (a:as) = foldl f (f a b) as
8481
8582 foreign import member "length" length :: forall a. [a] -> Number
8683
@@ -112,15 +109,13 @@ module Arrays where
112109 (:) a = concat [a]
113110
114111 concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
115− concatMap as f = {
116− var result = [];
117− foreach (a in as) {
118− result = result `concat` f a;
119− }
120− return result;
121− }
112+ concatMap [] f = []
113+ concatMap (a:as) f = f a `concat` concatMap as f
122114
123− foreign import filter :: forall a. [a] -> (a -> Boolean) -> [a]
115+ filter :: forall a. (a -> Boolean) -> [a] -> [a]
116+ filter _ [] = []
117+ filter p (x:xs) | p x = x : filter p xs
118+ filter p (_:xs) = filter p xs
124119
125120 empty :: forall a. [a] -> Boolean
126121 empty [] = true
@@ -140,24 +135,12 @@ module Arrays where
140135 zipWith _ _ _ = []
141136
142137 any :: forall a. (a -> Boolean) -> [a] -> Boolean
143− any p as = {
144− for (i <- 0 until length as) {
145− if (p (as !! i)) {
146− return true;
147− }
148− }
149− return false;
150− }
138+ any _ [] = false
139+ any p (a:as) = p a || any p as
151140
152141 all :: forall a. (a -> Boolean) -> [a] -> Boolean
153− all p as = {
154− for (i <- 0 until length as) {
155− if (!(p (as !! i))) {
156− return false;
157− }
158− }
159− return true;
160− }
142+ all _ [] = true
143+ all p (a:as) = p a && all p as
161144
162145module Tuple where
163146