
Am Samstag 15 August 2009 18:07:08 schrieb Daniel Bastos:
In article
, 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?
Reduction to weak head normal form yields
foo = let x = 3 in \y -> x + y
which means that foo is a function \y -> x + y paired with the value of the free variable x .
I see.
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?
You can't do cmp :: a -> a -> a -> Ordering cmp pivot x y = ... funkyFun :: (a -> a -> a -> Ordering) -> [a] -> [a] funkyFun _ [] = [] funkyFun c (x:xs) = x:sortBy (c x) xs main = do args <- getArgs print $ funkyFun cmp (some pseudorandom list depending on args) in C (at least not without some black magic). The plus3 example is a "closure" which is hardcoded and available at compile time. I think, to say that a language allows closures means it allows closures determined at run time.