我有以下代码段:
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
为什么?
答案 0 :(得分:2)
(>>)
的签名是('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3
。即,它组成了两个一元函数 - 你试图提供两个二进制函数,这些函数通常是有效的(尽管可能没用,或者至少不清楚),但不适用于你的< / em>功能类型:
鉴于(f >> g) x
等同于g(f(x))
,当f
为二进制时,预期结果是什么?在您的情况下,x
(int
)已部分应用于add
(int -> int -> int
),并且该部分应用((int -> int)
)将传递给{{ 1}}(也是times
),显然希望int -> int -> int
作为其第一个参数而不是函数类型int
。