
| In the GHC documentation which describes the extension of overlapping | instances, an example similar to the following is given. | | >class C a where | > f:a -> a | >instance C Int where | > f=e1 | >instance C a where | > f=e2 | > | >let g x = f x | >in g 1 | | In this case GHC takes an ¡°incoherent¡± decision by taking the second | instance as an instantiation of function f even it is executed with an input | of type Int. No it doesn't (ghc 6.4.1). I've just tried it. It uses the C Int instance, for exactly the reason you describe. There is a flag -fallow-incoherent-instances that _does_ allow incoherence Simon {-# OPTIONS -fallow-overlapping-instances -fglasgow-exts -fallow-undecidable-instances #-} module Main where class C a where f::a -> a instance C Int where f x = x+1 instance C a where f x = x main = print (let g x = f x in g (1::Int))