В дополнение к ответу @ JoshuaFox, один из ответов на ваш другой вопрос о том, почему бы не передавать все параметры за один раз, состоит в том, что он часто делает код повторяющимся и может добавить множество шаблонов, где это на самом деле не нужно.
У меня есть небольшое веб-приложение, написанное на F #, которое работает на нескольких разных платформах. У меня есть файл конфигурации, который предоставляет значения для каждой конкретной платформы. Во время выполнения я получаю эти значения из файла конфигурации и выполняю такие функции:
let private supptFunc (p1: string) (p2: string) (p3: string) : string = ...
...
// Partially apply parameters from config file to create a simpler
// function in the rest of the code
let externaFn1 = supptFunc (<get v1 from config file>) (<get v2 from config file>)
Это делает externalFn1
функцией, которая принимает строку и возвращает строку. Итак, в остальной части моего кода я вызываю externaFn1
только с одним параметром (p3
), который я получаю из запросов.
Таким образом, я реализую supptFunc
с точки зрения параметров, необходимых для выполнения работы, и никогда не беспокоюсь о том, откуда они берутся. Мне не нужно читать конфигурационный файл внутри кода или хранить значения в списке или карте где-то. Они всегда передаются.
Но мне не нужно делать эти значения доступными везде, где может понадобиться функция. Я просто создал полезную функцию, которую я представляю остальной части моего кода, который имеет эти значения, «запеченные» для текущей платформы. Все остальное в кодовой базе просто использует эту открытую функцию только с теми параметрами, которые у них есть и нужны.
Итак, теперь я могу проверить supportFunc
как функцию, которая всегда принимает всенеобходимые параметры и могут предоставить любые параметры, которые я хочу во время тестирования, чтобы проверить его поведение при любых обстоятельствах, которые я выберу. Но я не требую, чтобы все вызывающие абоненты предоставляли все, что нужно supportFunc
, поскольку они не обязательно обязаны хранить всю эту информацию.
Это не единственный вариант использования для частичного применения,но тот факт, что F # автоматически каррирует функции, делает простой способ сделать ваш код чище и проще.