
Hi, I feel embarrased when I post newbie questions after one year of decent Haskell programming. But it feels much better to ask than to suffer in ignorance. My newbie question is: Could anyone explain why the second version of the following function is better. Is there a tutorial kind of paper(or related) that gives programmer-view of closures? In particular when they are created, what do they contain and where and how they should be avoided to make program faster. Thank you very much, Saswat
You can see what is going on if you give the flag -ddump-simpl to GHC, and then look for the function Main.eval. You'll see that eval has a shape like
eval (Var x) = let ... in \env -> ... eval (Add u v) = let ... in \env -> ...
This is bad, because eval is building a function closure for the \env, instead of taking its two arguments together as does simplEval. We'd prefer
eval (Var x) env = let ... in ... eval (Add u v) env = let .. in ...