Вывод универсальных типов с функциональной композицией

Предположим, я хочу реализовать функциональную композицию, например:

    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.

В любом случае спасибо всем за качественные ответы.

6
задан Cheeso 23 May 2011 в 00:09
поделиться