n. *_* m. 12 haskell template-haskell
我正在尝试学习一些模板Haskell.作为练习,我写的,可以生成诸如函数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 |] ) []
]
Run Code Online (Sandbox Code Playgroud)
问题是我必须写$(isA [| Left |])而不是更直观isA Left.是否有可能摆脱丑陋的语法?我似乎无法在文档中找到答案.
该函数仅适用于单参数构造函数,但这是另一个问题.
ham*_*mar 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 |] ) []
]
Run Code Online (Sandbox Code Playgroud)
要使用它,你会写$(isA 'Left),这对眼睛来说更容易.
作为奖励,如果你尝试给它以外的东西Name,你得到一个类型错误而不是无可辩驳的模式匹配错误.
另请参见:模板Haskell语法