Como examinar um nome de construtor de dados citado no Template Haskel

Estou tentando aprender alguns modelos Haskell. Como exercício, escrevi uma função que pode gerar coisas comoisLeft eisRight (inspirado poressa questã). Aqui está minha humilde tentativa:

isA connam = do
    ConE nam <- connam
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (conP nam [wildP]) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]

O problema é que ele só funciona com construtores de um argumento. O culpado é oconP nam [wildP] padronizar. Idealmente, deve se parecer comconP nam (replicate (numArgs nam) wildP), OndenumArgs é uma função que retorna o número de argumentos do construtor. Mas como escrevo essa função? Imagino que preciso acessar a declaração de dados relevante, mas não tenho idéia de como fazê-lo.

Há outra pergunta sobre essa mesma funçãoaqu.

questionAnswers(1)

yourAnswerToTheQuestion