gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:02:58 26 4
gpt4 key购买 nike

我正在尝试学习一些模板 Haskell。作为练习,我编写了一个函数,它可以生成像 isLeft 这样的东西。和 isRight (受 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 .

最佳答案

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

但是,我们可以消除 [| ... |]并通过接收 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

关于haskell - 如何摆脱 $(...) 和 [| ... |] 使用 Template Haskell 函数时的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213938/

26 4 0