
On Sat, Sep 24, 2011 at 12:21 PM, Johannes Engels
Dear list members,
as an exercise, I tried to define a type class for structures with ordered key values. The key values could be numbers, but also strings. For instance, I intend to define an address list containing records with names as key values. So far, my type class definition contains a function "key", which should extract the key values from the structures, and a function which compares the key values. So I tried:
class StructsWithOrderedKeys a where -- no default definition for key key :: (Ord b) => a -> b
() :: a -> a -> Bool x y = (key x) < (key y)
Here I get the following error message from GHCI:
"Ambiguous type variable 'b' in the constraint: 'Ord b' arising from a use of 'key' ... Probable fix: add a type signature that fixes these type variable(s)"
Could anybody explain what ambiguity arises here? As the arguments of () are of the same type, I expected also the results (key x) and (key y) to be of the same type, which should be by the type constraint for "key" an instance of Ord. Why I am not allowed to use "key" in the definition of () ?
If a function has type:
key :: (Ord b) => a -> b
You have declared that the type 'b' can be whatever the caller wants (given the Ord constraint). So in the computations:
(key x) > (key y)
You haven't told it *which* 'b' you want to pick. And because the return value is consumed by a polymorphic function, the type inference engine doesn't have anything to go on. Does that make sense? Antoine