[Haskell-cafe] Re: irrefutable patterns for existential types / GADTs

apfelmus at quantentunnel.de apfelmus at quantentunnel.de
Sat Sep 30 07:42:45 EDT 2006

> But that makes it refutable! For the above, either
>  coerce _|_ x === x
> or the notation is being abused.

Making a pattern irrefutable does not mean that the function in question
will become lazy:

  fromJust (~Just x) = x

  fromJust _|_ === _|_

The point with coerce is that it looks very much like being lazy in its
first argument but in fact it is not.

> The trouble is that GADT pattern matching has an impact on types, as
> well as being a selector-destructor mechanism, and for the impact on
> types to be safe, the match must be strict.
> I think it's the extra power of GADTs to tell you more about type
> variables already in play which does the damage.

But I think that something still can be squeezed out, strictness is not
absolutely necessary. I thought something along the lines of

  f :: Eq a b -> a -> Maybe b
  f ~Refl x = Just x


  f _|_ x  === Just _|_

The point is one can always output the constructor Just, it does not
inspect the type of x.

Now, I don't think anymore that this is feasible as the type of (Just x)
still depends on the type of x (even if the constructor Just does not
mention it). Nevertheless, I still want to remove strictness, see my
next mail in this thread.

> For existentials, I'm not sure, but it seems to me that there's not such
> a serious issue. Isn't the only way you can use the type which allegedly
> exists to project out some dictionary/other data which is packed inside
> the existential? Won't this projection will cause a nice safe _|_
> instead of a nasty unsafe segfault?

I agree. The only practical problem I can imagine is that GHC internally
treats existentials as GADTs.


More information about the Haskell-Cafe mailing list