Предположим, я хочу реализовать функциональную композицию, например:
public Func<T,T> Compose<T>(Func<T,T> f, Func<T,T> g)
{
return new Func<T,T>( x => f(g(x)));
}
Теперь на практике я могу использовать эту Compose () fn следующим образом:
public String ToUpper(String s) { return s.ToUpper(); }
public String Replicate(String s) { return s+s; }
public void Run()
{
var h = Compose<String>(ToUpper, Replicate);
System.Console.WriteLine("{0}", h("fred"));
}
И результат FREDFRED
.
Есть ли способ использовать более простой синтаксис для вызова Compose? Я пробовал вот так:
var h = Compose(ToUpper, Replicate);
... но получаю ошибку компиляции:
ошибка CS0411: аргументы типа для метода ' FunctionalTest.Compose (System.Func, System.Func) 'не может быть выведен из использования. Попробуйте указать аргументы типа явно.
Вполне понятно. Мне интересно, можно ли объявить это по-другому и получить вывод, что на самом деле работа.
РЕДАКТИРОВАТЬ
Источник проблемы: я был ват ching онлайн-лекцию студенческого курса функционального программирования, CS61A Калифорнийского университета в Беркли. (найди на YouTube). У меня нет формального обучения FP, и я подумал, что могу чему-нибудь научиться. Профессор использует схему и говорит о том, что схема + лисп - это чисто функциональные языки, а другие языки - менее. Он определенно определил, что Паскаль, C, C ++ и Java (но не C #) лишены функциональных возможностей, и сказал, что с этими языками будет сложно выполнить функциональную композицию («Не вставая на голову»). Он утверждал, что указатель на функцию (доступный в C, C ++) - это не то же самое, что функция «сущность», лямбда. Я понимаю.
Забавно - он не упомянул Javascript или C #, которые я считаю основными языками, имеющими довольно хорошие функциональные возможности. (Я не знаю F #.)
Мне любопытно, что это лекция из прошлого года - 14 месяцев назад - и все же он, кажется, не осведомлен о функциональных аспектах основных современных языков.
Итак, я выполняю упражнения, но вместо схемы или шепелявости я использую C #. А также выполняю некоторые из них на Javascript.
В любом случае спасибо всем за качественные ответы.