函数组合参数错误

Function composition argument error

我有以下代码片段:

let add n x = x + n
let times n x = x * n
let addTimes = add 5 >> times 5
addTimes 4 

这没有任何问题。但是当我这样改变时

let add n x = x + n
let times n x = x * n
let addTimes = add >> times
addTimes 4 

我遇到了编译错误

error FS0071: Type constraint mismatch when applying the default type '(int -> int)' for a type inference variable. Expecting a type supporting the operator '*' but given a function type. You may be missing an argument to a function. Consider adding further type constraints

为什么?

(>>)的签名是('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3。也就是说,它由两个 unary 函数组成——您试图提供两个二元函数,这通常是有效的(尽管可以说没有用,或者至少不清楚),但不适用于 你的函数类型:

鉴于 (f >> g) x 等价于 g(f(x)),当 f 是二进制时,预期结果是什么?在您的情况下,x (int) 部分应用于 add (int -> int -> int),并且该部分应用 ((int -> int)) 被传递给 times(也就是 int -> int -> int),这显然需要一个 int 作为它的第一个参数,而不是函数类型 (int -> int).