在 F# 中,"Expecting" 和 "Given" 之间的类型不匹配错误是什么意思?

In F#, what does error of type mismatch between "Expecting" and "Given" mean?

我在使用 Binding.subModelSelectedItem() 时收到以下错误:

FS0001: Type mismatch. Expecting a 'string -> Binding<(Model * 'a), b>' 
but given a
  'string -> Binding<Model,Msg>'.
The type 'Model * 'a' does not match the type 'Model' 

来自以下 F# 代码:

type Msg =
        | SetAppointmentKey  of int option

然后,在绑定中:

 "SelectedAppointmentKey" |> Binding.subModelSelectedItem("AppointmentKeys", (fun m -> m.SelectedAppointmentKey), SetAppointmentKey)

我不明白错误信息。错误信息是什么意思?向谁“期待”?从什么“给予”?

抱歉我的无知,但是这个新手尝试的任何东西都没有解决这个问题。

感谢您的帮助。

TIA

我不确定您的代码中的具体错误在哪里,但我可以尝试帮助您理解错误消息的内容。一个简单的例子来说明同样的错误:

let foo (f:int -> int) = ()
let bar x = ""
foo bar

这不起作用,因为 foo 需要一个函数 int -> int,但是 bar return 是一个 string。你得到:

error FS0001: Type mismatch. Expecting a int -> int but given a int -> string The type int does not match the type string

错误消息告诉您用作参数的函数类型错误。它会告诉您这两种类型以及它的一部分出错的地方(这里,return 类型不匹配)。

查看您的错误信息:

FS0001: Type mismatch. Expecting a string -> Binding<(Model * 'a), 'b> but given a string -> Binding<Model,Msg>. The type Model * 'a does not match the type Model

您似乎在某个地方创建了一个函数,该函数接受一个字符串并且 return 是一个 Binding。这个函数应该 return 一个 Binding 并且 Model 作为第一个类型参数,但是你的代码 return 是一个由 Model 和其他东西组成的元组。

如果您的代码中有 fun x -> ..., something,可能很容易发生这种情况,也许是在您想要 (fun x -> ...), something 的地方。如果你这样写,你会得到类似的错误,例如:

let foo (f:int -> int) = ()
let bar = fun x -> 0, 1 
foo bar