F# 元组函数组合

F# 元组函数组合,f#,function-composition,F#,Function Composition,我很好奇为什么会这样 let f = (fun a b -> a, b) >> obj.Equals 给出了错误 没有名为“Equals”的可访问成员或对象构造函数接受1个参数 但这是有效的 let f = (fun a -> a, a) >> obj.Equals 以类型为例(>>)的类型是('a->'b)->('b->'c)->('a->'c),但是您试图用'a->('b->'a*'b)和obj*obj->bool类型的参数来调用它,而这些参数不能像这

我很好奇为什么会这样

let f = (fun a b -> a, b) >> obj.Equals
给出了错误

没有名为“Equals”的可访问成员或对象构造函数接受1个参数

但这是有效的

let f = (fun a -> a, a) >> obj.Equals

以类型为例<代码>(>>)的类型是
('a->'b)->('b->'c)->('a->'c)
,但是您试图用
'a->('b->'a*'b)
obj*obj->bool
类型的参数来调用它,而这些参数不能像这样组合在一起

当然,您可以定义一个用于组合二元函数和一元函数的新组合器:

let ( >>* ) f g a b = f a b |> g

在这种情况下,您可以在示例中使用它而不是
(>>)

,而无需定义新的组合运算符:

let f = (fun a b -> a, b) >> (<<) obj.Equals
让f=(有趣的ab->a,b)>>((((('d->'e)->)('a->'b->'c->'e)

当我尝试时得到的错误信息是,这个表达式应该有类型
a->'b*'a
,但这里有类型
'c*'d
,这是一个信息更丰富的类型。它更清楚地对应于kvb在他漂亮的回答中所写的内容。我不确定你为什么会收到不同的消息…啊。我忽略了
st arg是一元的。那个奇怪的错误消息(我仍然收到)让我很反感。谢谢。
let compose3 f g = f >> (<<) ((<<) g)
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e)