【发布时间】:2017-05-10 10:36:34
【问题描述】:
我看过ad 包,我了解它是如何通过提供class Floating 的不同实例然后实现衍生规则来自动区分的。
但在示例中
Prelude Debug.SimpleReflect Numeric.AD> diff atanh x
recip (1 - x * x) * 1
我们看到它可以将函数表示为ASTs,并将它们显示为带有变量名的字符串。
我想知道他们是怎么做到的,因为当我写的时候:
f :: Floating a => a -> a
f x = x^2
无论我提供什么实例,我都会得到一个函数 f :: Something -> Something
而不是 f :: AST 或 f :: String 之类的表示
实例无法“知道”参数是什么。
他们是怎么做到的?
【问题讨论】:
-
ad包使用了很多魔法底层和很多自定义类型类。实际上不是关于ad,但你可以观看这个关于设计AutomaticDifferentiation库的视频:youtube.com/watch?v=q1DUKEOUoxA&t=4322s -
请注意,要获得
recip (1 - x * x) * 1,您必须将diff atanh应用于x。简单的x不张扬,但它是您在这里看到的魔法的核心。
标签: haskell reflection typeclass instances automatic-differentiation