问题标签 [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 回答
469 浏览

haskell - 导出模板 haskell 生成的定义

我的模块包含定义,其中一部分被导出(在module子句中)。我也想导出 Template Haskell 生成的声明。但是由于似乎没有办法module用 TH 修改子句,所以我不能这样做。

是否可以指定应该导出 TH 生成的声明?或者也许还有其他方法可以做到这一点?

0 投票
6 回答
25346 浏览

haskell - What's so bad about Template Haskell?

It seems that Template Haskell is often viewed by the Haskell community as an unfortunate convenience. It's hard to put into words exactly what I have observed in this regard, but consider these few examples

I've seen various blog posts where people do pretty neat stuff with Template Haskell, enabling prettier syntax that simply wouldn't be possible in regular Haskell, as well as tremendous boilerplate reduction. So why is it that Template Haskell is looked down upon in this way? What makes it undesirable? Under what circumstances should Template Haskell be avoided, and why?

0 投票
0 回答
120 浏览

haskell - 从名称创建数据类型?

可能重复:
模板 Haskell 声明中的局部变量

我正在尝试构建一个简单的 Template Haskell 函数,给定一个像“Foo”这样的字符串,它将为data Foo = Foo.

现在,我正在尝试做类似mkDecl name = [d|data $(conT name) = Foo|]的事情,但这给了我错误:“类型或类声明的格式错误:$(conT name)”。知道发生了什么吗?

我可以使用 dataD 等将它写出来,但我更喜欢这种方式,因为它会更清楚发生了什么。

0 投票
2 回答
959 浏览

haskell - 具有关联类型同义词的 Data.Vector.Unbox 的自动派生

我有一个数据类型

其中 'q' 将是该类的一个实例

而“IntType”只是与“q”相关的底层表示(即 Int、Integral 等)。

我想让 Zq 成为Data.Vector.Unbox的一个实例。我们目前正在使用上面链接中建议的大约 50 行简单代码手动派生 Unbox。我们将在我们的代码中创建几种不同类型的“拆箱”,因此为每种类型编写 50 行并不吸引人。

我在这里找到了两种选择。一种替代方法是使用这个包,它使用 Template Haskell 来派生 Unbox 的实例。TH 代码如下所示:

问题是,我无法使用关联的类型同义词定义实例(或者我可以吗??)

[一个相关问题:为什么TypeSynonymInstances是 Fl​​exibleInstances隐含的扩展,不允许关联类型同义词实例?这是某种根本不同的野兽吗?]

我目前对该问题的解决方案是将 Zq 重新定义为

然后添加等式约束

在每个涉及 (Zq qi) 的情况下,这不是很优雅。我的(工作)拆箱派生变为

我觉得我应该能够在不诉诸于显式暴露类型“i”的情况下完成此操作。我所做的只是将它从关联的类型同义词移动到具有等式约束的显式参数。为什么这种“从根本上”是一种不同(而且显然更安全)的方法?有什么方法可以避免添加类型参数“i”并仍然获得自动拆箱派生?

除了额外的类型参数,我在使用 TH 包为 (Vector r) 派生 Unbox 时遇到了问题,也就是说,我想制作一个 Unbox Vector 的 Unbox Vector。我的尝试是这样的:

但我得到(很多)错误,例如:

我不确定为什么它找不到这个方法,当它适用于我的 Zq 类型时。


上面列出的第二种方法是使用扩展 GeneralizedNewtypeDeriving。我看到这种方法的最大问题是我有一些需要拆箱的实际数据(而不是新类型)。但是,仅使用扩展名,我应该可以编写

或者至少

第一个导致错误:

第二个给出:

我不确定为什么它不能导出这些实例,因为上面的帖子让我相信它应该能够。也许我可以摆脱使用 GeneralizedNewtypeDeriving 的关联类型同义词?(当我需要为“数据”派生 Unbox 时,这仍然(可能)不能解决我的问题。)

谢谢你的帮助!

0 投票
3 回答
7020 浏览

scala - 使用 Scala 生成代码

在 Scala 中使用 SBT 工具链时,是否可以编写一个任务来读取项目源代码的特殊部分以在编译时生成 scala 代码。

关于此的任何想法甚至文章/教程?我正在寻找类似于 Template Haskell 的东西。

0 投票
2 回答
273 浏览

haskell - 为什么 TemplateHaskell 会导致 GHC 加载包?

我有一个简单的模板 Haskell 程序,它打印当前模块的名称(主要,这里):

当我编译它时,我从 ghc 收到以下加载消息:

为什么启用 Template Haskell 时 ghc 会加载所有这些包?每当我构建一个使用 Template Haskell 的程序时,尤其是针对大量包构建的程序时,我的编译警告都会被这些多余的“加载”消息所淹没。如果我可以停止打印消息,或者完全停止(不必要的?)模块加载,那就太好了。

0 投票
1 回答
397 浏览

haskell - 将一个模块具体化为一条记录

假设我有一个任意模块

其中foobarbaz正确实现等。

我想将此模块具体化为自动生成的数据类型和相应的对象:

名称必须与原始模块完全相同。

我可以手动完成,但这非常乏味,所以我想编写一些代码来为我执行此任务。

我不太确定如何处理这样的任务。模板 Haskell 是否提供了检查模块的方法?我应该挂钩一些 GHC api 吗?或者我是否也可以使用更特别的方法,例如刮黑线鳕页面?

0 投票
1 回答
144 浏览

haskell - 一个构造函数产生一元计算的AST的表达式准引用器?

在非常简单的意义上,我有以下内容:

现在,在我决定为我的玩具语言使用准引用器会很方便之前,我从未将 Template Haskell 用于任何事情,所以我承认我可能会遗漏一些明显的东西。

但无论如何,我开始摆弄它,遵循一些教程等,基本上发现除了如何处理Fn构造函数之外的一切都很容易。

在网上搜索信息的过程中,我发现了人们写引号的两种一般方式:

  • 使他们的Expr数据类型成为 TH:s 的实例,Lift然后简单地 [| 引用 |] 解析产生的表达式
  • 导出DataTypeable等价于Expr,然后应用于dataToExpQ相同的解析器结果

在这两种情况下,我都遇到了Runtime Expr. 对于第一种情况,问题是我不知道如何实现:

(我确实设法自己实现了 Data.Text 的实例)。

我想真正的问题是我对 TH 的了解还不够好,但是到目前为止,没有多少教程或示例可以帮助我解决这个问题。

在第二种情况下,问题是Expr要成为 的实例Data,还需要有一个

那么我的问题是,是否有一种简单的方法可以做到这一点?或者我应该重新思考我的玩具语言的功能是如何工作的?

如果是后者,关于如何在不在 monad 中运行它们的情况下获得等效功能的任何建议?毕竟,这似乎是一种直观的解决方案,因为该语言的运行时环境需要状态和错误处理(这是我使用Either的)。

0 投票
1 回答
276 浏览

haskell - 模板 Haskell 元组更新功能

是否有函数,或者我如何编写函数updateTuple,例如:

基本上,第一个参数updateTuple是要更新的元组的长度,第二个参数是这些元素的索引。它产生一个接受两个元组的函数,第一个是更新函数,第二个是旧元组,并将这些更新函数应用于各自的元素。

我查看了tuple-th但我找不到任何可以用来轻松实现它的东西。

编辑: $(updateTuple 5 [0, 2, 4])也可以。

0 投票
1 回答
252 浏览

haskell - 使用模板 haskell 获取范围内的所有函数/值

使用模板haskell,有没有办法列出范围内的所有函数?就像是

我想要做的是获取以 test_ 开头的所有导入函数的列表,并自动运行测试。