如何摆脱$(...)和[|使用Template Haskell函数时的... |]语法?

时间:2011-08-27 10:25:09

标签: haskell template-haskell

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

1 个答案:

答案 0 :(得分:11)

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

但是,我们可以通过[| ... |]代替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