
Daniel Bastos wrote:
Heinrich Apfelmus wrote:
The simplest example of a closure is indeed
foo = add 3
where
add = \x y -> x + y
Question. This is actually equal to
add x y = x + y
But you wrote in terms of \. Why such preference?
I wanted to emphasize that add is a value just like 4 or "baz" , i.e. that it's not very different from writing say add = "baz"
Note that closures are an implementation detail. From a semantic point of view, add 3 can readily be understood as an ordinary function.
This makes sense. Because, even in a language like C, a similar effect can be achieved, no? For example
int plus(int x, int y) { return x + y; }
int plus3(int y) { plus(3, y); }
So, what I can't do in C, besides almost everything I can't do, is to do this nicely like I do in Haskell. But we don't call this a closure. In fact, we say C does not allow for closures. So what am I missing?
A litmus test for being a functional language is the ability to define function composition f . g = \x -> f (g x) This is not possible in C; mainly because functions cannot be defined locally, they have to be declared at the top-level. (I think this test is due to Lennart Augustsson, but I can't find a reference on the web right now.) Hm... this means that Brent's example foo x = add where add y = x + y is actually a much better demonstration of a closure than the one I gave. Yes, I think this one is impossible to write in C. Regards, apfelmus -- http://apfelmus.nfshost.com