[commit: ghc] wip/T9732: Generate two versions of pattern synonym matcher: * one where the continuation is lifted, * one where the continuation is unlifted. (423e9b2)

Dr. ERDI Gergo gergo at erdi.hu
Thu Oct 30 16:00:57 UTC 2014

On Thu, 30 Oct 2014, Simon Peyton Jones wrote:

> No no! Let's not do that.  It's grotesque to generate identical code 
> twice.  We must find a better way.

So the type of an open-kinded matcher function, for a pattern of type

pattern type P :: [T a]

would need to be something like

$m?P :: forall (r :: ?) a. [T a] -> R(r) -> R(r) -> r

where R(r) = Void# -> r  if r :: #
            , r           otherwise

Is there a way to do that? I couldn't think of anything better than to 
generate two versions:

$mP :: forall r a. [T a] -> r -> r -> r
$m#P :: forall (r :: #) a. [T a] -> (Void# -> r) -> (Void# -> r) -> r

Now, to cut down on the amount of code generated, I guess we could have

$m?P :: forall (r :: ?) a. [T a] -> (Void# -> r) -> (Void# -> r) -> r

and always compile pattern synonym match continuations into lambdas over 
this dummy Void#, but I thought we also wanted to avoid that...

Note that if P were to have arguments, the same problem would still be 
present with the fail continuation (but not the success one).

More information about the ghc-devs mailing list