3

我很好奇为什么会这样

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

给出错误

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

但这有效

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

2 回答 2

6

不定义新的组合运算符:

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

>> (<<)是一个不错的技巧,也可以扩展为更多参数:

let compose3 f g = f >> (<<) ((<<) g)
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e)
于 2011-09-13T05:07:57.493 回答
3

考虑类型。 (>>)有 type ('a -> 'b) ->('b -> 'c) -> ('a -> 'c),但你试图用'a -> ('b -> 'a*'b)and类型的参数来调用它obj * obj -> bool,不能像那样组合在一起。

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

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

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

于 2011-09-12T22:51:08.913 回答