2011-08-27 62 views
3

我想学习一些模板哈斯克尔。作为练习,我写了一个函数,可以生成诸如isLeftisRight(受this question启发)。这是我谦虚的尝试:如何检查模板Haskell中引用的数据构造函数名称?

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是一个函数,返回构造函数的参数个数。但是,我怎么写这样的功能呢?我想我需要访问相关的数据声明,但我不知道如何。

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

回答

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 |]) [] 
        ] 
+0

谢谢,工作! –

相关问题