I'm trying to learn Haskell and translating some Lisp
functions as exercises.

How would I write a Haskell function named ALWAYS that
behaves like this:

one = always 1
bozo = always "clown"

> map one [2,3,4,5,6]
[1,1,1,1,1]

> one 62
1

> map bozo [2,3,4,5,6]
["clown","clown" ,"clown", "clown"," clown"]

> bozo 62
"clown"

i.e. ALWAYS returns a function with a single parameter
that is ignored, returning instead the value given to
ALWAYS when the function was created.

This is what I've been trying:

always :: (a -> a) -> a -> a
always x = (\y -> x)

one = always 1

Michael

First, you want 'one' to take an integer and return 1. So,

one :: Integer -> Integer

since one = always 1, then

always 1 :: Integer -> Integer

So, 'always' takes an Integer and returns an Integer -> Integer

always :: Integer -> (Integer -> Integer)

But that's the same as

always :: Integer -> Integer -> Integer

You actually have the implementation correct, you just didn't have the
right type signature.

always first = (\second -> first)

Of course, neither of these implementations need to be tied to
Integers; they can be polymorphic. So, we end up with:

always :: a -> b -> a  -- no reason the second parameter has to be the
same type as the first, so use 'b' instead of 'a'.
always first = (\_ -> first)   -- replace 'second' with '_', because
we don't need to bind anything to the second parameter.

Does that makes sense?

Bryan Burgers
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to