这是运行良好的代码:
let f x y z = x + y + z
let g x y = f x y
let h x z = z |> f x
所以我可以写表达式“h 1”,FSI 显示:
val it : (int -> int -> int) = <fun:it@110-3>
如果我调用“h 1 2 3”,则参数将以正确的顺序应用。
但是如果最后一个参数的类型不同,事情就会不同:
let ff x y (z : string) = x + y
let gg x y = ff x y
let hh x (z : string) = z |> ff x
现在最后一个函数 hh 会导致错误消息:
Script.fsx(119,10):错误 FS0001:类型不匹配。期待 a
string -> 'a
但给定 aint -> string -> int
。类型与类型string
不匹配int
我理解为什么会发生这种情况——“z”附加到“ff x”之后,使其成为第二个参数。但是我希望在第一个示例表达式中“h 1 2 3”不能正常工作(作为“f 1 3 2”执行)。但它工作得很好。