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

haskell - 为什么 Safe Haskell 不支持 Template Haskell?

Safe Haskell的文档指出:

[...] 不幸的是,Haskell 模板可用于破坏模块边界,因此可用于访问此构造函数。[...] 使用 -XSafe 标志编译 Danger 模块将 Haskell 可用于安全子集的功能限制。这包括禁止 unsafePerfromIO、Haskell 模板、[...]

用作将 AST 转换为另一个 AST 的宏系统,是否不能简单地将 TH 限制为 Haskell 的安全子集,并将生成的 AST 限制为该子集?

0 投票
2 回答
336 浏览

haskell - 通过利用多个类型类实例之间的对称性来缩短代码

语境

我正在编写一个代表 SI 前缀的 Haskell 模块:

每个 SI 前缀都有对应的数据类型:

问题

我想写一个函数,当应用两个 SI 前缀时,静态确定两个前缀中的哪个更小。例如:

初步解决方案

这是一个使用类型类和功能依赖项的解决方案:

上面的解决方案似乎正确地解决了这个问题,但是它有一个缺点:类型类实例的数量是类型数量的二次方

问题

有没有办法将类型类实例的数量减少到与类型数量成线性关系,也许是通过利用对称性?

在这里使用 Template Haskell 可能更合适,在这种情况下,请随意提出建议作为解决方案。

谢谢!

0 投票
1 回答
519 浏览

haskell - 如何摆脱 $(...) 和 [| ... |] 使用 Template Haskell 函数时的语法?

我正在尝试学习一些模板 Haskell。作为练习,我编写了一个函数,可以生成isLeft和(受此问题isRight启发)之类的东西。这是我卑微的尝试:

问题是我必须写$(isA [| Left |])而不是更直观isA Left。是否有可能摆脱丑陋的语法?我似乎无法在文档中找到答案。

该函数仅适用于单参数构造函数,但这是另一个问题

0 投票
1 回答
247 浏览

haskell - 如何在 Template Haskell 中检查引用的数据构造函数名称?

我正在尝试学习一些模板 Haskell。作为练习,我编写了一个函数,可以生成isLeft和(受此问题isRight启发)之类的东西。这是我卑微的尝试:

问题是它只适用于单参数构造函数。罪魁祸首是conP nam [wildP]模式。理想情况下,它应该看起来像conP nam (replicate (numArgs nam) wildP)numArgs返回构造函数参数数量的函数在哪里。但是我该如何编写这样的函数呢?我想我需要访问相关的数据声明,但我不知道如何访问。

这里还有关于这个相同功能的另一个问题。

0 投票
2 回答
699 浏览

haskell - 如何动态调用在同一签名中的多个模块中定义的函数

我已经定义了很多函数(比如 100+),每个函数都执行特定的工作但具有相同的签名。那是这样的:

我想做的是提供实际的“运行”作为用户输入,例如:

目前,我导入了所有合格的模块,并将所有的run's 放入列表中[Maybe (IO())],所以这有效:

但随着n增长,我必须不断地维护一个大名单。

有什么方法可以使用 TemplateHaskell 定义大列表,或者只是在运行时根据需要加载相应的模块,而不必将每个模块分离到不同的共享库中。


根据epsilonhalbe的回答,我做了一些研究:

run1此代码块在和的结果之后打印 2 run2。如果我删除最后两行,它只会打印 0。似乎导入但未引用的函数不会被提取...

0 投票
2 回答
357 浏览

haskell - 模板 Haskell 类型引用问题

TemplateHaskell 引用记录了两个引号 ( '') 作为获取类型名称的方式:

这适用于这种类型(名称)。但是,我找不到一种方法让它很好地工作,例如Maybe String

我知道我可以通过 using 来解决[t| Maybe String |]问题,但这在 Q monad 中,并且需要更改类型,而且我认为只有在拼接时才在相应的时刻进行类型检查。

我也可以先定义一个类型别名,type MaybeString = Maybe String然后使用''MaybeString,但这也很麻烦。

''有什么方法可以通过报价直接得到我想要的东西?

0 投票
1 回答
1996 浏览

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

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

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

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

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

0 投票
2 回答
329 浏览

haskell - 如何避免模板 Haskell 声明引用中的额外缩进?

我有一个玩具程序:

让我们添加一些 Template Haskell 到它:

那么,让我们修复缩进:

一个空格就足够了,但我必须缩进两条尾随行。

我可以避免缩进我的大部分模块吗?(我的真实模块不仅仅是一行代码。)(不使用{ ; ; }符号?)

我确实希望在引用中捕获所有模块声明 - 在我可以替换为的普通代码中(...)$ ...是否有一些等价物[d|...|]可以让我避免使用右括号和缩进?

或者模块A是否可以通过某种方式说导入A的任何模块B的顶级声明都由函数A导出的函数自动处理?

笔记:

  1. 我的 Real Program 中的 Template Haskell 比它更复杂id——它扫描声明以查找 start 的变量名prop_,并构建一个包含它们的测试套件。有没有其他纯粹的 Haskell 方法我可以这样做,而不直接修改源文件?
  2. 我正在使用 GHC v6.12.1。当我使用 GHC v7.0.3 时,b.hs 的错误是针对不同的位置报告的b.hs:3:1——但行为是相同的。
0 投票
2 回答
1029 浏览

haskell - Haskell中的多项式分解

hammar 的帮助下,我制作了一个模板 Haskell 位,它可以编译

我现在面临一个我认为我无法通过这种方式解决的问题。

关于多项式的一个显着事实是,如果它们在模某个素数上不可约,则它们在有理数中是不可约的p。我已经有一种方法可以蛮力尝试在给定(有限)字段上分解多项式。

我想尝试为多个字段运行此功能。这是我想要的:

基本上我想尝试为大量的“除法”定义运行我的分解算法。

我认为这可能与 TH 有关,但似乎需要永远。我想知道将我的算术运算作为参数传递给它是否更容易isIrreducible

或者,这似乎是 Newtype 模块可以提供帮助的东西,但我想不出如果不以同样困难的方式使用 TH 它将如何工作......

有人对如何最好地实现这一点有任何想法吗?

0 投票
2 回答
317 浏览

haskell - 动态调度、智能构造函数、模板 Haskell?

我正在查看HaskellWiki > Existential type # Dynamic dispatch mechanism

而且我在想,在 Template Haskell 中应该有一种方法来参与这部分:

并自动推导出这部分:

这是在模板 Haskell 中完成的吗?这可以在 TH 中完成吗?是否可以在普通的旧 Haskell 中完成类似的操作,而无需手动写出所有智能构造函数?这是否需要一个比 TH 更强大的特殊预处理器?