# Another Newbie question :)

Derek Elkins ddarius at hotpop.com
Wed Nov 5 21:35:50 EST 2003

```On Wed, 5 Nov 2003 07:17:23 -0800 (PST)
Hal Daume III <hdaume at ISI.EDU> wrote:

> Keith is entirely correct.
>
> > You can see this from the definition of foldr:
> >
> > foldr :: (a -> b -> b) -> b -> [a] -> b
> > foldr f z   []   = z
> > foldr f z (x:xs) = f x (foldr f z xs)
> >
> > where clearly every [] is replaced by z and every : by f.
>
> I had heard this before when I was first beginning and didn't really
> find it "clear" :).  I think if you write foldr with f in infix
> notation it's a bit more clear:
>
> > foldr f z       [] = z
> > foldr f z   (x:xs) = x `f` foldr f z xs
>
> or even write the second line as
>
> > foldr f z   (x:xs) = x `f` xs'
> >   where xs' = foldr f z xs
>
> I think in this case it's a bit more clear how "f" is replacing the
> ":".
>
>  - Hal

Simply choose better names,
data Tree a = Empty | Leaf a | Branch (Tree a) (Tree a)

foldTree empty leaf branch Empty = empty
foldTree empty leaf branch (Leaf a) = leaf a
foldTree empty leaf branch (Branch l r)
= branch (foldTree empty leaf branch l)
(foldTree empty leaf branch r)

data List a = Nil | Cons a (List a)
foldList nil cons Nil = nil
foldList nil cons (Cons a as) = cons a (foldList nil cons as)

```