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 <hundalhh@yahoo.com> wrote:
Date: Sun, 5 Sep 2010 14:28:09 +0530 From: Rohit Garg <rpg.314@gmail.com>
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