khe*_*bie 2 f# functional-programming
对不起真的糟糕的冠军,但我无法想出一个更好的冠军......
我正在关注计算机程序的结构和解释,并试图从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
Run Code Online (Sandbox Code Playgroud)
我对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
是一个假设为a的单个参数float
.
现在sqrtIterator(improve(guess x) x)
返回float -> float
上面的错误消息.