我很好奇为什么这个
let f = (fun a b -> a, b) >> obj.Equals
给出错误
没有名为'Equals'的可访问成员或对象构造函数需要1个参数
但这有效
let f = (fun a -> a, a) >> obj.Equals
答案 0 :(得分: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)
答案 1 :(得分:3)
考虑类型。 (>>)
的类型为('a -> 'b) ->('b -> 'c) -> ('a -> 'c)
,但您尝试使用'a -> ('b -> 'a*'b)
和obj * obj -> bool
类型的参数调用它,这些参数不能像这样放在一起。< / p>
你当然可以定义一个新的组合子来组成二元函数和一元函数:
let ( >>* ) f g a b = f a b |> g
在这种情况下,您可以在示例中使用它而不是(>>)
。