Я обнаружил, что применение частичных функций, в отличие от карри, полезно при повторном использовании кода.
Для ясности, поскольку определения каррирования и частичного применения функции, кажется, размыты, под частичным применением функции я имею в виду получение функции с N параметрами и преобразование ее в функцию с параметрами N-1.
В частности, это было удобно при написании юнит-тестов. Поскольку я буду писать сотни модульных тестов, я стараюсь использовать тестовый код везде, где это возможно. Таким образом, у меня может быть общий метод тестирования, который переносит делегата в метод, который я хочу проверить, плюс некоторые параметры этого метода и ожидаемый результат. Общий тестовый метод выполнит тестируемый метод с предоставленными параметрами и будет иметь несколько утверждений, сравнивающих результат с ожидаемым результатом.
Проблема возникает, когда я хочу проверить метод, который имеет больше параметров, чем делегат, передаваемый в общий метод тестирования. Я мог бы написать другой общий метод тестирования, который идентичен первому, кроме принятия делегата с другой подписью. Это похоже на повторение, однако. Чтобы избежать необходимости писать такой повторяющийся код, я могу использовать приложение с частичной функцией для преобразования делегата, принимающего, скажем, два параметра, в делегата, принимающего один параметр. Теперь я могу использовать свой общий метод тестирования для тестирования методов, которые принимают один или два параметра.
Вот один из вспомогательных методов, которые я использую для исправления одного из аргументов делегата, который был передан:
/// <summary>
/// Fixes an argument of an action delegate, creating a closure that combines the
/// delegate and the argument value.
/// </summary>
/// <returns>An action delegate which takes only one argument.</returns>
public static Action<TIn1> FixActionArgument<TIn1, TIn2>(Action<TIn1, TIn2> action,
TIn2 argumentValue)
{
return in1 => action(in1, argumentValue);
}