[Haskell-cafe] Non-termination due to context
Emil Axelsson
emax at chalmers.se
Fri Jan 22 07:38:06 EST 2010
Ross Paterson skrev:
> On Fri, Jan 22, 2010 at 12:24:37PM +0100, Emil Axelsson wrote:
>> Consider the following program:
>>
>>> {-# LANGUAGE FlexibleInstances, OverlappingInstances, UndecidableInstances #-}
>>> class B a => A a
>>>
>>> instance A Int
>>>
>>> class Eq a => B a
>>>
>>> instance (A a, Eq a) => B a
>> [...]
>> Although I don't know all the details of the class system, it seems
>> unintuitive that I can make a program non-terminating just by
>> changing the context of a function (regardless of
>> UndecidableInstances etc.).
>>
>> Is this a bug or a feature?
>
> I'm afraid you voided the warranty when you used UndecidableInstances.
>
> You really do have a circularity between A and B here, so it's not
> surprising that you get a loop. By changing the context, you demanded
> more instances, undecidable ones in fact.
But still, I've always heard that "undecidable instances can cause the
type checker to loop, but if the compiler terminates, you're fine". Here
the loop happens at run time, so undecidable instances must be a little
more evil than I thought...
/ Emil
More information about the Haskell-Cafe
mailing list