I\'ve been getting into the nitty gritty of the haskell typesystem and trying to get at the fine points of type classes. I\'ve learned a heap, but I\'m hitting a wall on the fol
In
g :: C a => a -> Int -> a
g x y = f y
the return type of f y is fixed by the type signature, so that if you call, e.g. g 'a' 3, instance C Char will be used. But in
g :: C a => a -> Int -> String
g x y = show(f y)
there are two constraints on return type of f: it must be an instance of C (so that f can be used) and of Show (so that show can be used). And that's all! Coincidence of type variable names a in definitions of f and g doesn't mean anything. So the compiler has no way to choose between instance C Char and instance C Integer (or any instances defined in other modules, so removing these instances won't make the program compile).