【发布时间】:2017-03-31 08:08:57
【问题描述】:
F# 编译器生成的错误消息有时令人困惑。例如:
open Deedle
let inds = [1; 2; 6; 8; 11; 12]
let vals = [10; 20; 30; 40; 50; 60]
let siv = Series(inds, vals)
let fbminmax b (s: Series<float, float>) =
if b then (Seq.min s.Values) else (Seq.max s.Values)
let sgi =
siv
|> Series.groupInto (fun i _ -> i % 2 = 0) fbminmax
printfn "%A" <| sgi
// error FS0001: Type mismatch. Expecting a
// 'bool -> Series<int,int> -> 'a'
// but given a
// 'bool -> Series<int,int> -> float'
// The type 'float' does not match the type 'int'
我知道有一个错误(代码可以正常工作,Series<int,int> 替换 Series<float,float> 定义中的 fbminmax)。我知道一个
'bool -> Series<int,int> -> 'a'
是预期的。但我不明白为什么编译器说它被赋予了一个
'bool -> Series<int,int> -> float'
当它被赋予fbminmax时,这是一个
'bool -> Series<float,float> -> float'
此外,如果编译器确实被赋予了
'bool -> Series<int,int> -> float'
正如它声称的那样,float 扮演'a 的角色应该没问题。
有人可以提供一些关于发生了什么的见解吗?
【问题讨论】:
-
我认为参数 i 是一个 int,也许因为 groupInto 它应该是一个浮点数。很难说,因为我无法编译。
-
关于 lambda 的参数 i 的好点,但我认为编译器指的是
fbminmax而不是 lambda,即int -> 'b -> bool。 -
我不明白为什么它错误识别了
fbminmax的参数类型,但我想知道Deedle的Series类型是否内置了从int到float的任何隐式转换运算符?虽然 F# 不允许您将ints 传递给期望floats 的函数,但它构建在 CLI 之上,并且 CLI 层可能会发生一些事情(我不完全理解)这导致错误消息中报告的类型不太正确。我想知道如果您将代码反编译为 IL 指令,您会看到什么? -
@rmunn - 关于 IL 指令的好建议。我会尝试,但需要几天时间,因为周末我将无法访问我的系统。
标签: compiler-errors f#