我正在尝试学习一些模板 Haskell。作为练习,我编写了一个函数,可以生成isLeft
和(受此问题isRight
启发)之类的东西。这是我卑微的尝试:
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 |] ) []
]
问题是它只适用于单参数构造函数。罪魁祸首是conP nam [wildP]
模式。理想情况下,它应该看起来像conP nam (replicate (numArgs nam) wildP)
,numArgs
返回构造函数参数数量的函数在哪里。但是我该如何编写这样的函数呢?我想我需要访问相关的数据声明,但我不知道如何访问。
这里还有关于这个相同功能的另一个问题。