对不起真的很糟糕的标题,但我无法想出一个更好的标题......
我正在关注计算机程序的结构和解释,并且我试图从1.1.7节中做一个关于Netwon寻找平方根的连续近似方法的例子。
我尝试在F#中实现它,我相信我已经非常接近了,但可能存在某种句法问题。
这是我的代码(我使用linqpad,因此转储()),下面是问题
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
。
所以看起来我错过了一个参数,让它返回一个带一个参数的函数,但我看不出什么错误?
答案 0 :(得分:5)
将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
因此上面的错误消息。
答案 1 :(得分:4)
以下是修复的问题:
let rec sqrtIterator guess x =
if goodEnough guess x then guess
else sqrtIterator (improve guess x) x
你的父母错了。
答案 2 :(得分:4)
sqrtIterator
中的包围稍微偏离 - 您需要
else sqrtIterator (improve guess x) x