Композиция с функцией Tupled - PullRequest
       30

Композиция с функцией Tupled

3 голосов
/ 13 сентября 2011

Мне любопытно, почему это

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

выдает ошибку

Нет доступного члена или конструктора объекта с именем 'Equals', принимающего 1 аргумент

но это работает

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

Ответы [ 2 ]

6 голосов
/ 13 сентября 2011

Без определения нового оператора комбинатора:

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)
3 голосов
/ 13 сентября 2011

Рассмотрим типы. (>>) имеет тип ('a -> 'b) ->('b -> 'c) -> ('a -> 'c), но вы пытаетесь вызвать его с аргументами типа 'a -> ('b -> 'a*'b) и obj * obj -> bool, которые нельзя сделать так, чтобы они соответствовали друг другу.

Конечно, вы можете определить новый комбинатор для составления бинарных и унарных функций:

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

В этом случае вы можете использовать его в своем примере вместо (>>).

...