
On Wed, Jul 29, 2009 at 09:11:02PM +0100, Matthew J. Williams wrote:
Williams
wrote: Good morning
What is a closure and, what purpose does it serve?
This seems like a good explanation: http://www.haskell.org/haskellwiki/Closure
/M
Williams
wrote: How does a closure differ from a binding? An example or two would be nice. :-)
A closure is essentially a binding, *together with* the enclosing environment---the idea being that the binding may refer (via free variables) to things in its environment. The ability to have closures is absolutely crucial to having first-class functions. For example, consider this function: mkAdder :: Int -> (Int -> Int) mkAdder y = \x -> x + y mkAdder takes an Int as an argument, and returns a function (Int -> Int) as a result. But take a look at the function it returns: \x -> x + y has a free variable (y) which refers to its environment. So really what you get when you call mkAdder with a particular argument (say, 3) is a closure, containing the function \x -> x + y together with the environment (y = 3). Of course, hopefully you have realized that mkAdder is really just (+), written in a funny way! So this isn't a contrived example; closures are quite fundamental in Haskell. With that said, on some level the idea of a closure is really just an implementation detail---I wouldn't say that understanding it is of fundamental importance in learning Haskell. But learning things never hurts (except when it does). Hope this helps! -Brent