Roberto Zunino wrote:
foo, as defined above does not work (lazy patterns not allowed), and in

foo y = E (case y of E x -> x)

a variable escapes. I also tried with CPS with no success.

Is foo definable at all? I'm starting to think that it is not, and that
there must be a very good reason for that...

It's not definable, and there is a good reason. Existential boxes in principle contain an extra field storing their hidden type, and the type language is strongly normalizing. If you make the type argument explicit, you have

  foo (E <t> x) = E <t> x
  foo _|_ = E ??? _|_

The ??? can't be a divergent type term, because there aren't any; it must be a type, but no suitable type is available (foo has no type argument). You can't even use some default dummy type like (), even though _|_ does have that type, because you'd have to solve the halting problem to tell when it's safe to default.

I'm less clear on how important it is that type terms don't diverge. I think it may be possible to write cast :: a -> b if this restriction is removed, but I don't actually know how to do it.

-- Ben

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to