Weird Undecidable Instances Bug
Ashley Yakeley
ashley at semantic.org
Tue Sep 9 03:11:59 EDT 2003
On Monday, Sep 8, 2003, at 03:53 US/Pacific, Simon Peyton-Jones wrote:
> Consider an instance decl like:
> instance (Lte a b l,If l b a c) => Max a b c
> (This is a real example.) Notice that "l" is used on the LHS of the
> => but not the RHS. The idea is that "l" will get unified by a
> functional dependency. But if such a unification re-starts the
> solving process from scratch, we just get into an infinite loop (apply
> instance decl, apply fds, unify, start again, apply instance decl
> again, etc).
Could you give me an example of a goal you had in mind, where this
method fails? I tried
(Lte a b l,If l b a c) |- (Max a b c)
but the method works on this.
This reminds me of Prolog, somewhat. I wonder if it would be worth
prototyping confluent solvers in Prolog? I might try this actually, as
a way of getting a handle on the problem. I'd be especially interested
in any "tricky examples" you may have.
On the other hand, does the solver have to be confluent? What if it
spawned off different "threads", and gave up after doing a certain
amount of "work", which the user could set (like -fcontext-stack)?
Provided the "solver thread" scheduling is deterministic, I imagine
that every correct program would be solvable in a finite amount of work.
> I guess one possibility might be to make such an instance decl illegal.
Nooo!!! My workaround was simply to put the instance declaration in a
later module. Then "g" type-checks fine.
--
Ashley Yakeley, Seattle WA
More information about the Glasgow-haskell-bugs
mailing list