
nowgate:
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
So there are two cases you want to handle: * return a list, if the argument is a list * return a single value, if the argument is a single value. We can write thes functions separately: alwayList :: a -> [b] -> [a] alwayList n xs = map (const n) xs *Main> let one = always 1 *Main> one "foo" [1,1,1] *Main> let bozo = always "clown" *Main> bozo "haskell" ["clown","clown","clown","clown","clown","clown","clown"] Now handle the non-list case: alwaysAtom :: a -> b -> a alwaysAtom a b = a *Main> let one = alwaysAtom 1 *Main> one 'x' 1 Unifying these two under a common type class is left as an exercise ;) I guess the type signature for such a class would be something like: class Const a b a' | b -> a', a' -> a where Something like that. -- Don