Declaration vs. expression style
From HaskellWiki
(Difference between revisions)
(taken table from "History of Haskell") |
(SPJ's filter example) |
||
| Line 2: | Line 2: | ||
which are both supported by Haskell mainly because several language designers preferred these different styles. | which are both supported by Haskell mainly because several language designers preferred these different styles. | ||
| + | |||
| + | As illustration for the two styles, Simon Peyton Jones give two implementations of the Prelude function <hask>filter</hask>: | ||
| + | <haskell> | ||
| + | filter :: (a -> Bool) -> [a] -> [a] | ||
| + | </haskell> | ||
| + | |||
| + | == Declaration style == | ||
| + | |||
| + | <haskell> | ||
| + | filter p [] = [] | ||
| + | filter p (x:xs) | ||
| + | | p x = x : rest | ||
| + | | otherwise = rest | ||
| + | where | ||
| + | rest = filter p xs | ||
| + | </haskell> | ||
| + | |||
| + | == Expression style == | ||
| + | |||
| + | <haskell> | ||
| + | filter = | ||
| + | \p -> \ xs -> | ||
| + | case xs of | ||
| + | [] -> [] | ||
| + | (x:xs) -> | ||
| + | let rest = filter p xs | ||
| + | in if p x | ||
| + | then x : rest | ||
| + | else rest | ||
| + | </haskell> | ||
| + | |||
| + | == Comparison == | ||
There are characteristic elements of both styles. | There are characteristic elements of both styles. | ||
Revision as of 12:53, 3 July 2007
There are two main styles of writing functional programs, which are both supported by Haskell mainly because several language designers preferred these different styles.
filter
filter :: (a -> Bool) -> [a] -> [a]
Contents |
1 Declaration style
filter p [] = [] filter p (x:xs) | p x = x : rest | otherwise = rest where rest = filter p xs
2 Expression style
filter = \p -> \ xs -> case xs of [] -> [] (x:xs) -> let rest = filter p xs in if p x then x : rest else rest
3 Comparison
There are characteristic elements of both styles.
| Declaration style | Expression-style | ||
| where | let | ||
| Function arguments on left hand side: | f x = x*x | Lambda abstraction: | f = \x -> x*x |
| Pattern matching in function definitions: | f [] = 0 | case | f xs = case xs of [] -> 0 |
| Guards on function definitions: | f [x] | x>0 = 'a' | if | f [x] = if x>0 then 'a' else ... |
