
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).