[Haskell-beginners] Haskell type definitions

Patrick Mylund Nielsen haskell at patrickmylund.com
Wed Apr 10 17:39:40 CEST 2013


Yes, it is a type signature. It's "function name :: optional type
constraints => function of type a -> function of type b -> type c"

take' :: Num i => i -> [a] -> [a]     = take' is a function whose first
argument is of type i, where the i type must be an instance of the Num
typeclass. The function also takes a list of values of type a (any specific
type), and returns a list of values of the same type.

take' :: (Num i, Ord i) => i -> [a] -> [a]     = take' is a function whose
first argument is of type i, where the i type must be an instance of both
the Num and Ord typeclasses. The function also takes a list of values of
type a (any one type), and returns a list of values of the same type.

So the tuple behind the => doesn't mean that one of the arguments is a
tuple, or that the constraints apply to the arguments positionally, but
rather that the specified type, e.g. i, must satisfy some constraints--in
this case implement Ord and Eq so that you can check if it's below 0 (Ord)
and use it as a number (Num.) take' :: i -> [a] -> [a] would have been
valid too, but you wouldn't know if you can compare against i, or use it as
a number.

If you wanted to sort the [a], then indeed, you would need to make it take'
:: (Num i, Ord i, Ord a), since sort from Data.List has a type signature of
sort :: Ord a => [a] -> [a]


On Wed, Apr 10, 2013 at 11:32 AM, Angus Comber <anguscomber at gmail.com>wrote:

> I am learning Haskell using Learn You a Haskell.  On page 54 is an
> implementation of take like so:
>
>     take' :: (Num i, Ord i) => i -> [a] -> [a]
>     take' n _
>         | n <= 0 = []
>     take' _ []   = []
>     take' n (x:xs) = x : take' (n-1) xs
>
> I understand all the code apart from the first line.
>
> The :: part I understand as meaning this is a type definition?
>
> (Num i, Ord i) is a tuple.  The first element of the tuple has to be
> numeric, fair enough.  the second param has to be able to be ordered.
> The parameter is the same - both are i.  This means that the types
> have to be the same?
>
> Why is it not (Num i, Ord j)?  Isn't the 2nd tuple element
> referring to the list?  Which could be of any type?
>
> What does => signify?
>
> i -> [a] -> [a] means first parameter is numeric?  2nd param is any
> type list, 3rd param is any type list.  So this is saying first param
> numeric, 2nd param a list of any type and it returns a list of any
> type.  Well that is understandable I suppose.
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130410/f803b2d6/attachment.htm>


More information about the Beginners mailing list