对不起,我的头衔真的很差,但是我无法提出更好的头衔...

我正在遵循计算机程序的结构和解释,并试图从1.1.7节中获得有关Netwon的求平方近似的逐次逼近方法的示例。

我尝试在F#中实现它,我相信我已经很接近了,但是可能存在某种语法问题。

这是我的代码(我使用linqpad,因此使用了Dump()),下面是这个问题

let square a = a * a

let average a b = (a + b)/2.0

let a = average 2.0 1.0
a.Dump()

let improve guess x = average guess x

let i = improve 2.0 1.0
i.Dump()

let goodEnough guess x = abs (x - square(guess)) < 0.001

let g = goodEnough 3.0 4.0
g.Dump()

let g2 = goodEnough 2.0 4.0
g2.Dump()

let rec sqrtIterator guess x =
  if goodEnough guess x then guess
  else sqrtIterator(improve(guess x) x)

let sqrt x = sqrtIterator 1.0 x

在对sqrtIterator进行递归调用时收到错误消息:
该表达式应具有float类型,但此处具有float -> float类型。

所以看来我缺少一个参数,使它返回一个带有一个参数的函数,但是我看不出怎么了?

最佳答案

sqrtIterator(improve(guess x) x)更改为sqrtIterator (improve guess x) x将解决此问题。

sqrtIterator表达式的第一部分开始:
if goodEnough guess x then guess
类型检查器知道guessfloat,因为goodEnough已经具有float -> float类型。
else分支也应具有float类型。因此,sqrtIterator具有类型float -> float -> float

但是,您在sqrtIterator(improve(guess x) x)分支中提供了else。最外面的括号表示improve(guess x) x是单个参数,假定为float

现在sqrtIterator(improve(guess x) x)返回float -> float,因此出现上述错误消息。

10-06 05:48
查看更多