【问题标题】:How to examine a quoted data constructor name in Template Haskell?如何在 Template Haskell 中检查引用的数据构造函数名称?
【发布时间】:2011-08-27 20:15:12
【问题描述】:

我正在尝试学习一些模板 Haskell。作为练习,我编写了一个函数,它可以生成像isLeftisRight 之类的东西(灵感来自this question)。这是我卑微的尝试:

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

【问题讨论】:

    标签: haskell template-haskell


    【解决方案1】:

    虽然您可以使用 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-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多