
I have not tested, but I suspect, that if you don't provide a type
signature for either isPalindrome or sumList, it will get inferred
correctly. The problem is that if you *do* provide a typesignature for
either of them, you *have* to give it a properly constrained
typesignatures.
I think for sumList a signature of [a] -> a does not work, because you
use the adding function, which has type (Num a) -> a -> a -> a. So
when providing a signature for sumList you have to add the Num a
constraint too. The same goes for isPlindrome, where Eq a is
neccessary because of the type of ==.
Like, for isPalindrome the signature [a] -> Bool is not correct,
because it says any 'a' will work (because it is not constrained), but
any 'a' wont work -- it has to be an equitable 'a', thus the (Eq a)
constraint.
The point is, that when providing a signature, it has to be
sufficently (or more) constrained -- GHC won't patch it wor you, but
if the signature is missing it will (try to) infer it.
Markus
On Sun, Sep 5, 2010 at 1:20 PM, Hein Hundal
Date: Sun, 5 Sep 2010 14:28:09 +0530 From: Rohit Garg
RWH: chapter 3 - in question 5, you have to write a function which determines if a list is a palindrome. Here is my solution
isPalindrome :: (Eq a) => [a] -> Bool isPalindrome [] = False isPalindrome x = compareLists x (reverse x) where compareLists [x] [y] = x == y compareLists (x:xs) (y:ys) = if x == y then compareLists xs ys else False
Although it works, my question is why ghci refuses to run it without the "(Eq a) => " being added to the type signature of the function. Presumably, it is to let ghc know that you can perform equality tests on a. If so, then why does the sumList function below work without any type signature of any kind? I haven't told ghc that the input list elements can be added together.
sumList [] = 0 sumList (x:xs) = x + sumList xs
When I compile isPalindrome with ghc 6.12.1, I do not get any errors even if I drop the type signature. If I drop the type signature and use ghci to get the type signature (":t isPalindrome"), then I get
*Main> :t isPalindrome isPalindrome :: (Eq t) => [t] -> Bool
So, it seems that ghc 6.12.1 correctly infers the types.
Cheers, Hein
PS: Haskell does equality of lists, so you can also use the definition
isPalindrome v = v == reverse v
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners