问题标签 [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.
haskell - 为什么 Safe Haskell 不支持 Template Haskell?
Safe Haskell的文档指出:
[...] 不幸的是,Haskell 模板可用于破坏模块边界,因此可用于访问此构造函数。[...] 使用 -XSafe 标志编译 Danger 模块将 Haskell 可用于安全子集的功能限制。这包括禁止 unsafePerfromIO、Haskell 模板、[...]
用作将 AST 转换为另一个 AST 的宏系统,是否不能简单地将 TH 限制为 Haskell 的安全子集,并将生成的 AST 限制为该子集?
haskell - 通过利用多个类型类实例之间的对称性来缩短代码
语境
我正在编写一个代表 SI 前缀的 Haskell 模块:
每个 SI 前缀都有对应的数据类型:
问题
我想写一个函数,当应用两个 SI 前缀时,静态确定两个前缀中的哪个更小。例如:
初步解决方案
这是一个使用类型类和功能依赖项的解决方案:
上面的解决方案似乎正确地解决了这个问题,但是它有一个缺点:类型类实例的数量是类型数量的二次方。
问题
有没有办法将类型类实例的数量减少到与类型数量成线性关系,也许是通过利用对称性?
在这里使用 Template Haskell 可能更合适,在这种情况下,请随意提出建议作为解决方案。
谢谢!
haskell - 如何动态调用在同一签名中的多个模块中定义的函数
我已经定义了很多函数(比如 100+),每个函数都执行特定的工作但具有相同的签名。那是这样的:
我想做的是提供实际的“运行”作为用户输入,例如:
目前,我导入了所有合格的模块,并将所有的run
's 放入列表中[Maybe (IO())]
,所以这有效:
但随着n
增长,我必须不断地维护一个大名单。
有什么方法可以使用 TemplateHaskell 定义大列表,或者只是在运行时根据需要加载相应的模块,而不必将每个模块分离到不同的共享库中。
根据epsilonhalbe的回答,我做了一些研究:
run1
此代码块在和的结果之后打印 2 run2
。如果我删除最后两行,它只会打印 0。似乎导入但未引用的函数不会被提取...
haskell - 模板 Haskell 类型引用问题
TemplateHaskell 引用记录了两个引号 ( ''
) 作为获取类型名称的方式:
这适用于这种类型(名称)。但是,我找不到一种方法让它很好地工作,例如Maybe String
:
我知道我可以通过 using 来解决[t| Maybe String |]
问题,但这在 Q monad 中,并且需要更改类型,而且我认为只有在拼接时才在相应的时刻进行类型检查。
我也可以先定义一个类型别名,type MaybeString = Maybe String
然后使用''MaybeString
,但这也很麻烦。
''
有什么方法可以通过报价直接得到我想要的东西?
haskell - 模板haskell中的数据构造函数
我正在尝试创建环 Z/n (就像普通算术一样,但是以某个整数为模)。一个例子是 Z4:
以此类推。我希望能够快速生成这些东西,我认为这样做的方法是使用模板 haskell。理想情况下,我只想$(makeZ 4)
让它吐出Z4
我上面定义的代码。
不过,我在这方面遇到了很多麻烦。当我这样做时,genData n = [d| data $n = $n Integer]
我得到“数据/新类型声明中的解析错误”。如果我不使用变量,它确实有效:[d| data Z5 = Z5 Integer |]
,这一定意味着我对变量做了一些奇怪的事情。我不确定是什么;我尝试通过 newName 构建它们,但这似乎也不起作用。
任何人都可以帮我解决这里发生的事情吗?
haskell - 如何避免模板 Haskell 声明引用中的额外缩进?
我有一个玩具程序:
让我们添加一些 Template Haskell 到它:
那么,让我们修复缩进:
一个空格就足够了,但我必须缩进两条尾随行。
我可以避免缩进我的大部分模块吗?(我的真实模块不仅仅是一行代码。)(不使用{ ; ; }
符号?)
我确实希望在引用中捕获所有模块声明 - 在我可以替换为的普通代码中(...)
,$ ...
是否有一些等价物[d|...|]
可以让我避免使用右括号和缩进?
或者模块A是否可以通过某种方式说导入A的任何模块B的顶级声明都由函数A导出的函数自动处理?
笔记:
- 我的 Real Program 中的 Template Haskell 比它更复杂
id
——它扫描声明以查找 start 的变量名prop_
,并构建一个包含它们的测试套件。有没有其他纯粹的 Haskell 方法我可以这样做,而不直接修改源文件? - 我正在使用 GHC v6.12.1。当我使用 GHC v7.0.3 时,b.hs 的错误是针对不同的位置报告的
b.hs:3:1
——但行为是相同的。
haskell - Haskell中的多项式分解
在hammar 的帮助下,我制作了一个模板 Haskell 位,它可以编译
到
我现在面临一个我认为我无法通过这种方式解决的问题。
关于多项式的一个显着事实是,如果它们在模某个素数上不可约,则它们在有理数中是不可约的p
。我已经有一种方法可以蛮力尝试在给定(有限)字段上分解多项式。
我想尝试为多个字段运行此功能。这是我想要的:
基本上我想尝试为大量的“除法”定义运行我的分解算法。
我认为这可能与 TH 有关,但似乎需要永远。我想知道将我的算术运算作为参数传递给它是否更容易isIrreducible
?
或者,这似乎是 Newtype 模块可以提供帮助的东西,但我想不出如果不以同样困难的方式使用 TH 它将如何工作......
有人对如何最好地实现这一点有任何想法吗?
haskell - 动态调度、智能构造函数、模板 Haskell?
我正在查看HaskellWiki > Existential type # Dynamic dispatch mechanism。
而且我在想,在 Template Haskell 中应该有一种方法来参与这部分:
并自动推导出这部分:
这是在模板 Haskell 中完成的吗?这可以在 TH 中完成吗?是否可以在普通的旧 Haskell 中完成类似的操作,而无需手动写出所有智能构造函数?这是否需要一个比 TH 更强大的特殊预处理器?