[Haskell-beginners] Why the length function I wrote has such a type signature?

Chaddaï Fouché chaddai.fouche at gmail.com
Thu Nov 11 03:34:11 EST 2010


On Thu, Nov 11, 2010 at 9:24 AM, 贾旭卿 <amazingjxq at 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ï


More information about the Beginners mailing list