
On Friday 12 November 2010 20:14:25, Tom Murphy wrote:
And the type signature given by ghci is
myLength :: (Num t1) => [t] -> t1
But why is the signature not written as: myLength :: [t] -> (Num t1) => t1 or something similar?
I thought that the Num typeclass being first implied that it was the function's first argument.
A type signature like myLength's consists of two parts, - a context; here (Num t1) - the part giving the type (subject to the constraints in the context). The language definition says the context comes first, then "=>", finally the type. If contexts were always written next to the type they apply to, it would lead to unreadable type signatures and repetition (the same constraint can apply to several type variables). Not to mention multi parameter type classes. Strictly speaking, there's a third part, the quantification, but that's usually left implicit (explicit foralls require a language extension). So the full type is myLength :: forall a n. (Num n) => [a] -> n for all types a and n, if n is an instance of Num, myLength has (can have) the type [a] -> n.