There is a general solution, but it essentially involves polymorphism a-la-Omega (or as in Coq's Calculus of Inductive Constructions).

The most general description of (Tree Int) is as the Stream
S = [Int, Tree, Id, Id, ...]
You are now attempting to pull-off exactly 2 "terms" from that Stream. The solutions are:
0: Int, Tree
1: Tree Int, Id
2: Id (Tree Int), Id
3: Id (Id (Tree Int)), Id

Let [EMAIL PROTECTED] denote n-ary type-level application, where T is a list of types, and i>=0. Consider the pair
( S!!(i+1), (take i S)@i)
This is the /closed-form/ for the n'th solution (m, a) for unifying (m a) with (Tree Int). A better way to _represent_ this closed form is as
(S, i) where S = [Int,Tree, Id, Id, ...]
from which further constraints can decide what is the 'proper' value of i to take. This even shows how to do defaulting: in the absence of further information, take the smallest i possible. [I phrase it this way because there are times where constraints will force a certain minimum on i, but no maximum].

In other words, the above should be backwards compatible with current behaviour, since the 'default' solution would be m=Tree, a=Int.

Jacques

Simon Peyton-Jones wrote:
I remember that I have, more than once, devoted an hour or two to the question "could one add 
Id as a distinguished type constructor to Haskell".  Sadly, each time I concluded 
"no".

I'm prepared to be proved wrong.  But here's the difficulty.  Suppose we want 
to unify
        (m a) with (Tree Int)

At the moment there's no problem: m=Tree, a=Int.  But with Id another solution 
is
        m=Id, a=Tree Int

And there are more
        m=Id, a=Id (Tree Int)

We don't know which one to use until we see all the *other* uses of 'm' and 'a'.

I have no clue how to solve this problem.  Maybe someone else does.  I agree 
that Id alone would be Jolly Useful, even without full type-level lambdas.

Simon
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime

Reply via email to