3

我正在尝试学习一些模板 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返回构造函数参数数量的函数在哪里。但是我该如何编写这样的函数呢?我想我需要访问相关的数据声明,但我不知道如何访问。

这里还有关于这个相同功能的另一个问题。

4

1 回答 1

7

虽然您可以使用reify并检查类型来确定数据构造函数的数量,但使用记录模式生成与数量无关的代码要容易得多:

isFoo :: Bar -> Bool
isFoo p = case p of
    (Foo {}) -> True     -- Valid no matter what the arity of Foo is
    _        -> False

这可以通过在您的代码中替换conP为来完成。recP

isA connam = do
    ConE nam <- connam
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (recP nam []) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]
于 2011-08-27T12:06:37.743 回答