[Haskell-cafe] constant functions
Bryan Burgers
bryan.burgers at gmail.com
Wed Dec 27 21:55:26 EST 2006
> 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
More information about the Haskell-Cafe
mailing list