【发布时间】:2019-09-21 00:08:22
【问题描述】:
我是 F# 新手,在这个代码片段中有一些编译问题:
let rec mywhile p f s =
if p s then s
else
let s1 = f s
mywhile p f s1
let eps = 0.001
let dichotomy f a b =
let out (a, b) = a
let c a b = (a + b) / 2.
out (mywhile (fun (a, b) -> a - b < eps)
(fun (a, b) -> if f c * f a < 0 then (a, c) else (c, b))
(a, b))
特别是这里:a - b < eps, then (a, c)
期望一个支持运算符'-'的类型,但给定了一个函数类型。您可能缺少函数的参数。
【问题讨论】:
-
当类型推断发生意想不到的事情时,它有助于注释那些你知道其类型的值(即使是暂时的)。在这种情况下,问题在于
a和b被推断为'a -> 'b -> float,这实际上是一个函数类型,不支持-运算符。当您将传递给mywhile的第一个lambda 更改为(fun (a: float, b: float) -> a - b < eps)时,下一行会显示更多错误,表明a、b和c的类型不兼容,这表明f可能不兼容推断为您期望的类型,并且您可能希望使用注释来修复其类型。
标签: if-statement f#