
I don't understand it perse, but I've run into it often enough to say
that the problem is the monomorphism restriction. When you say let
mySort = sort, instead of having the type
mySort :: Ord a => [a] -> [a]
which is what you'd expect, instead there is some bizarre rule in the
haskell spec that says it has to choose () for a in this case so if
you look at the type after you define it in ghci, you'll see the type
is actually
mySort :: [()] -> [()]
which is completely useless for anything. If you go :set
-XNoMonomorphismRestriction in ghci, you'll get the correct type and
it will work the way you intend. There is apparently some obscure
case where this is desirable and that is the only reason it has not
been removed by default.
On Sun, Dec 11, 2011 at 1:14 PM, Henry Lockyer
Hello Haskellers
Why is it that in GHCI I can do, for example,
replicate 6 5 [5,5,5,5,5,5] let my6 = replicate 6 my6 5 [5,5,5,5,5,5]
but if I do
sort "bav" "abv"
this is ok, but
let mySort = sort mySort "bav"
<interactive>:1:8: Couldn't match expected type `()' with actual type `Char' Expected type: [()] Actual type: [Char] In the first argument of `mySort', namely `"bav"' In the expression: mySort "bav"
and/or
mySort [6,5,9]
<interactive>:1:13: No instance for (Num ()) arising from the literal `9' Possible fix: add an instance declaration for (Num ()) In the expression: 9 In the first argument of `mySort', namely `[6, 5, 9]' In the expression: mySort [6, 5, 9]
This is eluding me at the moment..! ;-)
/ Henry
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners