Каково преимущество Приправления карри в C#?
Каково преимущество достижения частичного функционального приложения на функции с приправой карри?
Преимущество каррирования в C # состоит в том, что он позволяет разработчикам на C # разрабатывать в стиле функционального программирования.
Подумайте о LINQ. Запрос LINQ позволяет передавать метод в качестве параметра:
someCollection.Where(x => x.someVal == 1);
x.someVal == 1
оценивается как функция, а затем , где
использует возвращаемое значение в своем собственном выполнении.
Это пример, с которым знакомо большинство разработчиков .NET 3, но немногие понимают, что они балуются программированием функций. Без способности Карри LINQ был бы невозможен.
... обнадеживаю, что компенсирует мой глупый комментарий.
Если ваш вопрос заключался в том, как реализовать каррирование в C #, вот пример
public Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> func)
{
return p1 => p2 => func(p1, p2);
}
Каррирование может быть реализовано на любом языке, который поддерживает замыкания. (лямбда-выражения) и полезен для частичного приложения функции, например, в программировании пользовательского интерфейса, где не принимаются все входные данные, необходимые для выполнения функции, поэтому каррированная функция передается с уже полученными входными данными, захваченными в ней.
Из Википедия
Каррирование на самом деле не очень отличается от того, что мы делаем, когда вычисляем функцию для некоторых заданных значений на листе бумаги. .
Возьмите функцию
f (x, y) = y / x
Чтобы вычислить
f (2,3)
, сначала заменитеx
на2
.Поскольку результатом является новая функция в y, эта функция g (y) может быть определена как
g (y) = f (2, y) = y / 2
Затем, заменив
y
аргумент с3
,дает результат
g (3) = f (2,3) = 3/2
.На бумаге, используя классические обозначения, просто кажется, что мы делаем все это одновременно . Но на самом деле, когда заменяют аргументы на листе , это делается последовательно (т.е. частично). Каждая замена приводит к функции внутри функции . По мере того как мы последовательно заменяем каждый аргумент, мы преобразуем функцию в более простые и простые версии оригинала. В конце концов, мы получаем цепочку функций как в лямбда-исчислении, где каждая функция принимает только один аргумент, а функции с несколькими аргументами обычно в карри.
Практическая мотивация каррирования заключается в том, что очень часто функции получаются путем передачи некоторых, но не всех аргументов каррированной функции (часто называется частичным применением) полезны; например, во многих языках есть функция или оператор, аналогичный plus_one. Каррирование упрощает определение этих функций.