Я читал Эта статья, и мне было интересно.
Подвести итоги тем, кто не хочет читать весь пост. Автор реализует функцию более высокого порядка, названную Curry (это отредактировано мной без его внутреннего класса):
public static Func<T1, Func<T2, TResult>>
Curry<T1, T2, TResult>(this Func<T1, T2, TResult> fn)
{
Func<Func<T1, T2, TResult>, Func<T1, Func<T2, TResult>>> curry =
f => x => y => f(x, y);
return curry(fn);
}
Это дает нам возможность взять выражение, подобное F (x, y) например.
Func<int, int, int> add = (x, y) => x + y;
и назовем его способом F.Curry() (x) (y);
Эта часть, которую я поняла, и я считаю ее классной. То, что я не могу оборачивать, - это практические способы такого подхода. Когда и где этот метод необходим и что можно получить от него?
Спасибо заранее.
Отредактировано: После первых 3 ответов я понимаю, что коэффициент усиления будет заключаться в том, что в некоторых случаях, когда мы создаем новую функцию из curries, некоторые параметры не оцениваются. Я сделал этот небольшой тест на С# (имейте в виду, что меня интересует только реализация С#, а не теория карри вообще):
public static void Main(string[] args)
{
Func<Int, Int, string> concat = (a, b) => a.ToString() + b.ToString();
Func<Int, Func<Int, string>> concatCurry = concat.Curry();
Func<Int, string> curryConcatWith100 = (a) => concatCurry(100)(a);
Console.WriteLine(curryConcatWith100(509));
Console.WriteLine(curryConcatWith100(609));
}
public struct Int
{
public int Value {get; set;}
public override string ToString()
{
return Value.ToString();
}
public static implicit operator Int(int value)
{
return new Int { Value = value };
}
}
При двух последовательных вызовах curryConcatWith100 оценка ToString() для значения 100 вызывается дважды (один раз для каждого вызова), поэтому я не вижу никакого усиления в оценке здесь. Я что-то пропустил?