gpt4 book ai didi

haskell - 模板haskell中的数据构造函数

转载 作者:行者123 更新时间:2023-12-04 02:03:29 25 4
gpt4 key购买 nike

我正在尝试创建环 Z/n (就像普通算术一样,但是以某个整数为模)。一个例子是 Z4:

instance Additive.C Z4 where
zero = Z4 0
(Z4 x) + (Z4 y) = Z4 $ (x + y) `mod` 4

以此类推。我希望能够快速生成这些东西,我认为这样做的方法是使用模板 haskell。理想情况下,我只想去 $(makeZ 4)并让它吐出 Z4 的代码就像我上面定义的那样。

不过,我在这方面遇到了很多麻烦。当我做 genData n = [d| data $n = $n Integer]我收到“数据/新类型声明中的解析错误”。如果我不使用变量,它确实有效: [d| data Z5 = Z5 Integer |] ,这一定意味着我对变量做了一些奇怪的事情。我不确定是什么;我尝试通过 newName 构建它们,但这似乎也不起作用。

任何人都可以帮我解决这里发生的事情吗?

最佳答案

Template Haskell documentation列出你可以拼接的东西。

A splice can occur in place of

  • an expression; the spliced expression must have type Q Exp
  • an type; the spliced expression must have type Q Typ
  • a list of top-level declarations; the spliced expression must have type Q [Dec]


$n 的两次出现中,但是,您正在尝试拼接名称。

这意味着您不能使用引号和拼接来执行此操作。您必须使用 Language.Haskell.TH 中提供的各种组合子来构建声明。模块。

我认为这应该等同于您正在尝试做的事情。
genData :: Name -> Q [Dec]
genData n = fmap (:[]) $ dataD (cxt []) n []
[normalC n [strictType notStrict [t| Integer |]]] []

是的,它有点难看,但你去。要使用它,请用新名称调用它,例如
$(genData (mkName "Z5"))

关于haskell - 模板haskell中的数据构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com