Построение связанного набора вызовов методов из объекта C # в f # - PullRequest
0 голосов
/ 08 февраля 2011

Я изучаю F #, и я задумался.Вы можете связывать операции с обычными операторами, такими как

let aChainedFunc = List.map func >> List.reduce func

, а затем вы можете перейти к let result = aChainedFunc aList, чтобы получить результаты тех же операций, что позволяет несколько раз использовать их в небольшом количестве кода.

Но что, если у вас есть объект C #, для которого вы хотите вызывать методы из этого объекта, но предварительно построить цепочку, как в примере F # выше?

Очевидно, что для этого требуется объект, который может работать нормальноa.Method1().Method2().Method3(), чтобы заставить это работать, но есть ли способ разумно настроить это, чтобы позволить этому работать без создания метода, в котором вы вместо этого передаете его?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Если вы хотите создать последовательность статических вызовов методов (или вызовов методов расширения), скажем, SomeType.Method1, SomeType.Method2 и OtherType.Method3, то вы можете написать метод C # Compose, который ведет себя аналогично >> оператор в C #:

Func<T, R> Compose<T, U, R>(Func<T, U> f1, Func<U, R> f2) {
  return v => f2(f2(v));
}

Тогда вы сможете написать что-то вроде:

Compose(SomeType.Method1, SomeType.Method2).Compose(OtherType.Method3); // ...

Обратите внимание, что это будет работать только для методов, принимающих один аргумент (но вы можете определить перегруженныйверсии, которые принимают несколько аргументов, и компилятор должен иметь возможность их выводить).

Если вы вызываете методы экземпляра, тогда нет синтаксиса для ссылки только на метод - вам нужно какое-то выражение для вызова метода на,Более легким способом, чем написание метода, было бы написать лямбда-выражение:

// Chain multiple operations
Func<SomeType, SomeType> composed = v => v.Method1().Method2().Method3();
// Use chained operation two times
var v1 = composed(foo1);
var v2 = composed(foo2);
0 голосов
/ 08 февраля 2011

в f #, вы можете переопределить функцию .net, как

let foo x = a.Foo x

и

let boo y = b.Boo y

тогда в вашей цепочке вы просто используете свои переопределенные функции как

let moo  = 
    foo >> boo

или

let moo z = 
   z
   |> foo
   |> boo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...