gpt4 book ai didi

haskell - 有没有一种很好的方法来编写这个涉及单例数据类型的 Template Haskell 代码?

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

我刚刚开始使用 Template Haskell(我终于有了一个用例,耶!)现在我在认知上陷入了困境。

我想要做的是生成表单的单例数据类型声明

data $V = $V deriving (Eq,Ord)

从名字开始 V (希望以大写字符开头!)。明确地说,我正在尝试编写一个函数 declareSingleton类型 String -> DecsQ (我应该在这里提到我使用的是 GHC 7.6.1,template-haskell 版本 2.8.0.0)这样拼接
$(declareSingleton "Foo")

相当于
data Foo = Foo deriving (Eq,Ord)

我已经让以下代码工作并做我想做的事,但我对它不是很满意:
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in sequence [
dataD (cxt []) n [] [normalC n []] [''Eq,''Ord]
]

我希望得到类似以下的工作:
declareSingleton :: String -> Q [Dec]
declareSingleton s = let n = mkName s in
[d| data $n = $n deriving (Eq,Ord) |]

我尝试了 $s 的各种组合,但无济于事(但并非详尽无遗!) , $v , $(conT v) , v , 'v所以我不得不假设我对 Template Haskell 工作原理的心智模型过于简单。

我是否在这里遗漏了一些明显的东西,我是否以某种基本方式混淆了类型名称和构造函数名称,我可以写 declareSingleton吗?以一种好的(r)方式?

如果是,如何;如果不是,为什么不呢?

(旁注:Haskell 模板 API 变化很快,我为此感到高兴——我希望这个简单的类型最终实现一个具有关联类型族的多参数类型类——但 API 目前正在经历的流失并没有' t 使搜索教程变得容易!TH 在 6.12.1 或 7.2(大多数现有教程的编写时)中的实现方式与现在的工作方式有很大的不同......)

最佳答案

来自 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]


所以例如构造函数名称根本无法在当前版本的 Template Haskell 中拼接。

我不认为你可以做很多事情来简化这个用例(除非将整个声明构造为字符串并通过 Dec 中的 toDec 将其转换为 haskell-src-meta )。

您可以考虑简单地将声明的不同部分绑定(bind)到局部变量。虽然更冗长,但它使代码更易于阅读。
declareSingleton :: String -> Q [Dec]
declareSingleton s = return [DataD context name vars cons derives] where
context = []
name = mkName s
vars = []
cons = [NormalC name fields]
fields = []
derives = [''Eq, ''Ord]

关于haskell - 有没有一种很好的方法来编写这个涉及单例数据类型的 Template Haskell 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15285016/

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