在使用模板Haskell函数时,如何摆脱$(…)和[|…|]语法?

在使用模板Haskell函数时,如何摆脱$(…)和[|…|]语法?,haskell,template-haskell,Haskell,Template Haskell,我想学一些哈斯克尔的模板。作为练习,我编写了一个函数,该函数可以生成isLeft和isRight(灵感来源于)。以下是我谦虚的尝试: isA connam = do ConE nam <- connam nn <- newName "p" lamE [varP nn] $ caseE (varE nn) [ match (conP nam [wildP]) ( normalB [| True |] ) [],

我想学一些哈斯克尔的模板。作为练习,我编写了一个函数,该函数可以生成
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 |] ) [] 
                     ]
isA connam=do

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

但是,我们可以消除
[|…|]
,也可以通过使用
名称而不是
Exp
,使代码更安全:

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

谢谢。我完全可以接受。我记得在某个地方读到,
$
对于拼接不再是必需的,但我不确定它是在什么上下文中,或者它是否适用于这里。@n.m.我刚才在我的答案中添加了这一点:)我猜你在写评论时仍然在看我的原始答案。啊哈,因此,如果我想
isA'Left
生成一个名为
isalift
的函数声明,而不是实际函数,我可以省略$,对吗?