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é <chaddai.fouche@gmail.com>
On Thu, Nov 11, 2010 at 9:24 AM, 贾旭卿 <amazingjxq@gmail.com> wrote:
> This is exercise 3.1 of Real World Haskell. I have my length function 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ï