【发布时间】:2010-09-05 21:37:46
【问题描述】:
我在尝试在 F# 中实现自动微分时遇到了一些问题。我认为问题在于评估不是“懒惰”。
这是我的代码:
type Diff =
{d : double; df : Diff}
static member (+) (x : Diff, y : Diff) =
{d = x.d + y.d; df = x.df + y.df}
static member (-) (x : Diff, y : Diff) =
{d = x.d - y.d; df = x.df - y.df}
static member (*) (x : Diff, a : double) =
{d = x.d * a; df = x.df * a}
static member (*) (x : Diff, y : Diff) =
{d = x.d * y.d; df = (x.df * y) + (y.df * x)}
let rec dZero = {d = 0.0; df = dZero}
let dConst x = {d = x; df = dZero}
let dId x = {d = x; df = dConst 1.0}
let test = dId 5.0
let add (x:Diff) = (x+x).d
如果我尝试使用“添加测试”,我会收到堆栈溢出错误,我认为这是由于我的类型本身依赖于“+”的 (+) 定义。
有什么办法可以解决这个问题吗?任何帮助将不胜感激。
非常感谢,阿什
【问题讨论】: