问题标签 [template-haskell]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1837 浏览

haskell - 模板 Haskell 阶段限制的问题

我刚开始学习 Template Haskell,并坚持简单的拼接问题。
在一个模块中,我实现tupleN了回复元组的第 N 个元素的函数:

在主模块中,我有:

这似乎有效,但它不会。编译器打印错误:

如果我将元组描述直接放入拼接表达式中,代码就会起作用:

我在第一个变体中缺少什么?

0 投票
1 回答
325 浏览

haskell - 模板 Haskell 和隐式参数

有没有办法使用模板haskell创建带有隐式参数的函数或让带有隐式参数的绑定?

即是否可以使用模板haskell生成这样的签名:

或者像这样的调用:

在模板 haskell 的 API 文档中,我找不到合适的代数数据类型或任何可以帮助我解决此主题的函数。我正在使用 GHC 7.4.2。

如果在模板 haskell 中没有对这个扩展的原生支持,是否还有其他可能在编译期间注入代码(可能类似于模板 haskell 中的一般“代码注入功能”?)。

编辑:我尝试了评论中的建议,这就是发生的事情:

而这有效:

似乎不支持。

0 投票
1 回答
856 浏览

haskell - 模板 Haskell 引用中的独立派生声明

为什么模板 Haskell 忽略引用中的独立派生声明?

0 投票
2 回答
586 浏览

c - 是否可以在运行时生成和运行 TemplateHaskell 生成的代码?

是否可以在运行时生成和运行 TemplateHaskell 生成的代码?

在运行时使用 C,我可以:

  • 创建函数的源代码,
  • 调用 gcc 将其编译为 .so (linux)(或使用 llvm 等),
  • 加载 .so 和
  • 调用函数。

模板 Haskell 是否可以做类似的事情?

0 投票
1 回答
113 浏览

compilation - 为什么 GHC 不会以这个 GADT 模板 Haskell 模块终止?

我在使用模板 Haskell 生成 GADT 时遇到问题。问题是我无法让代码完全编译。加载文件时 GHCI 不会终止,并且 ghc 进程会使用尽可能多的内存和 cpu(2.4GB,50~70%)。

我试图做一个最小的例子,它仍然会发生。我是使用牛津符号 ( [| |]) 还是通过手动应用 TH 数据类型来构建函数都没有关系。考虑这个简单的模块:

我在用于 x64 的 Haskell 平台的 OSX Mountain Lion 上使用 GHC 7.4.2。

有谁知道为什么会这样?也许我错误地使用了一些代码?

0 投票
1 回答
230 浏览

haskell - 在 Haskell quasiquoter 中拼接任意表达式

通读Why It's Nice to be Quoted,在第 3 节中,有一个在 quasiquote 中拼接变量标识符的示例。

我明白为什么递归调用subst是在外部完成的[:lam| ... |],这是因为第 3.2 节中的函数从变量名中antiVarE构建了TH.varE

我的问题是需要多少工作才能支持除了变量名之外的任意表达式拼接?

例如:

0 投票
5 回答
3753 浏览

haskell - 输出函数名的函数

是否可以在 Haskell 中实现一个返回自己的函数名的函数?

一种可能的类型可能是(a -> b) -> String.

0 投票
2 回答
436 浏览

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

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

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

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

相当于


我已经让以下代码工作并做我想做的事,但我对它不是很满意:

我希望得到类似以下的工作:

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

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

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

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

0 投票
1 回答
185 浏览

haskell - 为代数数据类型定义 TH Lift 实例

假设我有一个具有多个构造函数的代数数据类型,例如

我将如何有效地创建Lift实例?最简单的方法是

虽然这是非常多余的。当然,我不能直接将不同的动物抽象出来lift x = [| x |],尽管从概念上讲这与我想要实现的目标相似。有没有办法在 TH 中这样做,这样我就不必为每个数据构造函数再次编写同一行?

0 投票
2 回答
539 浏览

haskell - 是否有用于引用的模板 haskell 函数?

我正在玩 Template Haskell。我想创建一个准引用器,它允许我为记录创建默认初始化程序,即类似

应该创建一个函数

基本上它与数据声明的语法相同,由默认值扩展。现在record是一个自定义的 QuasiQuoter,但是我不想在其中解析自己的表达式和类型。理想情况下,我只需要将花括号内的块划分为语句并查找=and ::

[e| ...|]所以我正在寻找一个与使用or引用有效相同的函数[t| ...|]。我在 Hoogle 中搜索了一个函数String -> ExpQ,或者String -> Q Exp没有找到任何东西。

如果我不清楚我在寻找什么:我知道 QuasiQuoters。正如我所提到的:record 一个 QuasiQuoter。现在传递给我的准引用器的字符串包含表达式 (like Node 7 (Node 8 Nil Nil) Nil) 和类型 (like Trueor Maybe (Either A B))。我可以自己解析这些,但我希望有一个函数可以为我完成,就像我将字符串传递到像[e|...|].

所以:我正在寻找一个函数,我可以将表达式作为字符串或类型作为字符串提供,并返回适当的ExpType对象。我相信它必须存在于 Q monad 中,因为它应该根据上下文评估表达式或类型(就像引用一样)。