
myLength :: [a] -> Int
This is the first type signature I wrote. And I changed the Int into Num
after
ghci tell me it's wrong. This type signature still not work. But the
standard length
function's type signature is this:
length :: [a] -> Int
I think my type signature is right but it's not. And I can not find the
reason.
2010/11/11 Chaddaï Fouché
This is exercise 3.1 of Real World Haskell. I have my length function
On Thu, Nov 11, 2010 at 9:24 AM, 贾旭卿
wrote: like this:
myLength [] = 0 myLength (_:xs) = 1 + (myLength xs)
And I assumed the type signature is like this: mylength :: [a] -> Num
But when I wrote this into the file and reloaded it into ghci, there is an error.
The type signature for `mylength' lacks an accompanying binding Failed, modules loaded: none.
And the type signature given by ghci is
myLength :: (Num t1) => [t] -> t1
So how can I modify the function to have a type signature like the first one?
You can't, since Num isn't a type, it's a typeclass.
myLength :: (Num b) => [a] -> b
means that myLength takes a list of any type and can return any type that is an instance of Num (Num being the typeclass of numbers, that means that you can do most things you do on numbers, adding them, multiplying them, and so on...).
If you want a simpler type signature, you could use :
myLength :: [a] -> Int
or
myLength :: [a] -> Integer
since Int (32 or 64 bits integer) and Integer are real type that are instances of the Num typeclass.
-- Jedaï