if (++) were left associative ?

Jon Fairbairn Jon.Fairbairn@cl.cam.ac.uk
Sun, 07 Apr 2002 17:50:16 +0100


> Thanks,
> =

> but you are assuming that foldl evaluates the intermediate result right=

> away.

It must

> My understanding of foldl is thus:
> =

> foldl (++) [] [[1],[2],[3],[4]]

[snip]

> -> [] ++ [1] ++ [2] ++ [3] ++ [4]
> =

> Which brings me back to my original question...

Well, you've removed the parentheses that give you the
information you want.

foldl (++) [] [[1],[2],[3],[4]]
-> foldl (++) ([] ++ [1]) [[2],[3],[4]]
-> foldl (++) (([] ++ [1]) ++ [2]) [[3],[4]]
-> foldl (++) ((([] ++ [1]) ++ [2]) ++ [3]) [[4]]
-> foldl (++) (((([] ++ [1]) ++ [2]) ++ [3]) ++ [4]) []
-> (((([] ++ [1]) ++ [2]) ++ [3]) ++ [4])

now you have to ask what has to be evaluated in order to get
the head of the result.

The answer is that you have to evaluate ((([] ++ [1]) ++
[2]) ++ [3]) before you can find it, and to get that, you
have to evaluate (([] ++ [1]) ++ [2]) and so on.


In the other case, you can get the head of (a:...)++ (b ++
c) by evaluating only the first steps of the first (++).


Does that help?

  J=F3n


-- =

J=F3n Fairbairn                                 Jon.Fairbairn@cl.cam.ac.u=
k
31 Chalmers Road                                         jf@cl.cam.ac.uk
Cambridge CB1 3SZ            +44 1223 570179 (after 14:00 only, please!)