haskell - 模板haskell范围之外的编译时间代码重写?

标签 haskell template-haskell

是否可以创建一个在编译时从模板 haskell 引号之外重写 haskell 代码的函数?

例如:

differentiate :: Floating a => (a -> a) -> a -> (a,a)
differentiate = -- what goes here?

f :: Num a => a -> a
f = sin

g :: Num a => a -> (a,a)
g = differentiate f

并在编译时将 g 转换为:
g x = (sin x, cos x)

我希望我的“差异化”函数被传递给“f”的 AST,并让我在编译之前重写它。据我所知,如果不传递函数的完整语法,即“g = distinct sin”,就不能在模板 haskell 中执行此操作。

谢谢

最佳答案

您正在谈论计划中的宏。答案是不。 Haskell 函数必须是“引用透明的”,这意味着如果你给它两个在指称上相等的参数,结果必须在指称上相等。即,每个 f一定有

f (1 + 1) = f 2

如果 f如果是宏,则不一定如此。然而,这个属性对于语言的“纯洁性”是必不可少的——是什么让 Haskell 很好地推理和重构。

但是,在 automatic differentiation 上有大量工作要做。在 Haskell 中,没有一个需要宏系统——抽象建模(和类型类使其看起来不错)是必需的。

关于haskell - 模板haskell范围之外的编译时间代码重写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643901/

相关文章:

haskell - 模板 Haskell : reify in GHCi

haskell - 执行monad中的每个语句时如何编写一个打印 "step i of N"的monad?

haskell - 在堆栈的包文件中,库依赖项和可执行文件依赖项之间有什么区别?

haskell - 多核处理器上 Haskell 运行时的结构

haskell - 如何在 Haskell 中构建非确定性状态 monad?

haskell - 如何显式调用haskell语法的准引用器?

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

haskell - 找不到模块 `Date.Time.Calendar'

haskell - 堆栈空间溢出(可能与mapM有关)

haskell - inline-c 和 language-c-inline 有什么区别?