Tupled函数组合

时间:2011-09-12 22:12:13

标签: f# function-composition

我很好奇为什么这个

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

给出错误

  

没有名为'Equals'的可访问成员或对象构造函数需要1个参数

但这有效

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

2 个答案:

答案 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

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