【问题标题】:How to get rid of $(...) and [| ... |] syntax when using a Template Haskell function?如何摆脱 $(...) 和 [| ... |] 使用 Template Haskell 函数时的语法?
【发布时间】:2011-08-27 21:15:18
【问题描述】:

我正在尝试学习一些模板 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 |] ) [] 
                     ]

问题是我必须写$(isA [| Left |]) 而不是更直观的isA Left。是否有可能摆脱丑陋的语法?我似乎无法在文档中找到答案。

该函数仅适用于单参数构造函数,但这是针对another question

【问题讨论】:

    标签: haskell template-haskell


    【解决方案1】:

    语法存在是有原因的;告诉读者这里有编译时魔法。只有当您的接头位于顶层时,您才能消除$(...)

    但是,我们可以消除[| ... |],并通过使用Name 而不是Exp,使代码更安全:

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

    要使用这个,你可以写$(isA 'Left),这样会更容易一些。

    作为奖励,如果您尝试给它提供除 Name 以外的其他内容,则会收到类型错误,而不是无可辩驳的模式匹配错误。

    另请参阅:Template Haskell Syntax

    【讨论】:

    • 谢谢。我绝对可以忍受。我记得在某处读到 $ 不再需要拼接,但我不确定它在什么情况下,或者它是否可以在这里应用。
    • @n.m.我刚刚将其添加到我的答案中 :) 我猜您在撰写评论时仍在查看我的原始答案。
    • aha,所以如果我想让isA 'Left 生成一个名为isALeft 的函数的声明而不是实际的函数,我可以省略$,对吗?
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2015-05-24
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多