对不起,我的头衔真的很差,但是我无法提出更好的头衔...
我正在遵循计算机程序的结构和解释,并试图从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
类型检查器知道guess
是float
,因为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
,因此出现上述错误消息。