P. R. Stanley:
> is there another general pattern for mylen, head or tail?
> mylen [] = 0
> mylen (x:xs) = 1 + mylen (xs)
> 
> head [] = error "what head?"
> head (x:xs) = x
> 
> tail [] = error "no tail"
> tail (x:xs)= xs

Benjamin Franksen:
> Another very common 'pattern' is to factor the recursion into a
> generic higher order function
> 
> fold op z []     = z
> fold op z (x:xs) = x `op` (fold op z xs)
>  -- parentheses not strictly necessary here, added for readability
> 
> and define mylen in terms of fold
> 
> mylen = fold (+) 0

Looks more like a sum than a length. Benjamin really meant something
like this:

mylen = fold (const succ) 0

Note, the Prelude already contains various fold functions, so you don't
have to write your own. The one corresponding to fold is "foldr".
(Benjamin just wrote it out to demonstrate the practice of extracting
and naming reusable computational structures as higher-order functions).

Now, can you write head as a fold? Would you want to? What about tail?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to