[Haskell-beginners] Lambda Functions

Philip Scott haskell-beginners at foo.me.uk
Thu Feb 26 17:07:25 EST 2009


Okay, thanks everyone for the help with the last question; I've got 
another one for you if you are keen. It's short and sweet.

You can easily define a lambda expression that takes a tuple - e.g. in ghci

 > let foo = \(x,y) -> 42
foo :: (t, t1) -> Integer

 > foo (5,5)
42

Yay. Now that isn't a very exciting function. Tt takes two anythings and 
gives you a nice meaningful number. Now let us say for some perverse 
reason I want to make a lambda to test for equality. That is, 
reimplement the functionality of (==) using, well, (==).

 > let foo2 = \(x,y) -> x == y

foo2 :: ((), ()) -> Bool

Uh-oh. Now things are getting a little odd. I am not entirely sure what 
that type signature means (I was expecting to see something about the 
types having to be the same and an instance of the Eq class but alas..) 
The function certainly doesn't do what I want it to:

 > foo2 (5,5)

    No instance for (Num ())
      arising from the literal `5' at <interactive>:1:6
    Possible fix: add an instance declaration for (Num ())
    In the expression: 5
    In the first argument of `foo2', namely `(5, 5)'
    In the expression: foo2 (5, 5)

This is itself a stupid problem, but it is a distilled version of some 
trouble I was having writing a filter that works on a list of tuples. 
Any pointers or slaps in the face for being too stupid warmly welcomed. 
I have already tried my usual trick of smothering the thing parentheses 
but it appeared to be all in vain.

All the best,

Philip



More information about the Beginners mailing list