在使用模板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
的函数声明,而不是实际函数,我可以省略$,对吗?