yet another very simple overlapping instance example
Razvan Musaloiu-E.
razvanm@mail.com
Wed, 25 Jun 2003 20:56:42 +0800
Hi!
Keith Wansbrough wrote:
>>instance Op_plus MyInt MyInt where
>>instance (Num a) => Op_plus a MyInt where
>>instance (Num a) => Op_plus MyInt a where
>
> [..]
>
>>Overlapping instance declarations:
>> multi.hs:9: Op_plus a MyInt
>> multi.hs:12: Op_plus MyInt a
>>Failed, modules loaded: none.
>
> The GHC manual talks about this at:
>
> http://haskell.cs.yale.edu/ghc/docs/latest/html/users_guide/type-extensions.html#INSTANCE-DECLS
>
> I think the issue is that GHC still requires that overlapping
> instances either do not unify, or have an instantiation ordering.
> Your 2nd and 3rd instances are unordered: 2 is an instance of 3, and 3
> is an instance of 2. GHC doesn't notice the first instance.
As you mention that documentation, it says:
GHC is also conservative about committing to an overlapping
instance. For example:
class C a where { op :: a -> a }
instance C [Int] where ...
instance C a => C [a] where ...
f :: C b => [b] -> [b]
f x = op x
From the RHS of f we get the constraint C [b]. But GHC does not
commit to the second instance declaration, because in a
paricular call of f, b might be instantiate to Int, so the first
instance declaration would be appropriate. So GHC rejects the
program. If you add -fallow-incoherent-instances GHC will
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
instead silently pick the second instance, without complaining
about the problem of subsequent instantiations.
I tried -fallow-incoherent-instances but it only worked on that example
even the two examples seems to be the same problem. Am I right?
Obs: I'm working with a GHC version 5.04.2. Does it make sens to try the
latest 6.0 one?
> I observe that the docs above say "Yell if this restriction bites
> you.", so I shall hand this over to the GHC developers to discuss
> further...
Big 10x! :-) Should I further explain why do I need something like this?
And if yes, where should I do this?
--
Razvan ME