模板 haskell 中的数据构造函数

2023-11-26

我正在尝试创建环 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 构建它们,但这似乎也不起作用。

谁能帮我解决这里发生的事情吗?


The 模板 Haskell 文档列出了您可以拼接的东西。

拼接可以代替

  • 一种表达;拼接表达式必须具有类型Q Exp
  • 一种类型;拼接表达式必须具有类型Q Typ
  • 顶级声明列表;拼接表达式必须具有类型Q [Dec]

在这两种情况下$n,但是,您正在尝试拼接name.

这意味着您无法使用引号和拼接来做到这一点。您必须使用以下可用的各种组合器来构建声明Language.Haskell.TH module.

我认为这应该相当于你想要做的事情。

genData :: Name -> Q [Dec]
genData n = fmap (:[]) $ dataD (cxt []) n []
                           [normalC n [strictType notStrict [t| Integer |]]] []

是的,它有点难看,但就是这样。要使用它,请使用新名称来命名,例如

$(genData (mkName "Z5"))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板 haskell 中的数据构造函数 的相关文章

随机推荐