beginis used in Scheme to evaluate statements for side-effect. Haskell has no side-effects. (However, Haskell 1.3 does have a
doform, used for sequentialization.)
ifdoes not need to be a special form in Haskell, because of lazy evaluation.
flatten :: [[a]] -> [a] flatten [] =  flatten (:ys) = flatten ys flatten ((x:xs):ys) = x : (flatten (xs:ys))However, the last two lines are just the append operator
flatten :: [[a]] -> [a] flatten  =  flatten (y:ys) = y ++ (flatten ys)But this is just a fold:
flatten :: [[a]] -> [a] flatten = foldl (++) Higher-order functions have allowed us to shorten the code. Whether or not it is clearer is up to you.
Alas, we cannot implement
superflatten, because it must
have only one type. Lists of different depths have different types:
[1, 2] :: [Int] [[1,2], [3,4]] :: [[Int]] [[[1,2],[3,4]], [[5,6],[7,8]]] :: [[[Int]]]And these types cannot be unified by a type-variable.
However, we can implement
fringe, on binary trees. See the Haskell tutorial.
Array comprehensions, however, are much more important. Otherwise we would have to use the inefficient incremental-update operators.
hash :: [Char] -> Int hash = (foldl (+) 0) . (map ord) hash "MSDOS 6.000" -- prints 666 hash "SYSTEM 7.0" -- prints 666Coincidence? We think not.