Функциональное разложение против карринг против частичного применения - PullRequest
1 голос
/ 04 ноября 2019

Карринг, частичное применение и функциональное разложение - это одно и то же? Есть ли разница между ними?

Я читаю об этом, я нашел то же самое. Я не понимаю, есть ли разница между ними. Зачем писать код, подобный этому, в java, когда вы можете передать все параметры одному методу за один раз ?

 Function<Integer,Function<Integer,Function<Integer, Integer> > > 
        triadder = u -> w -> v -> u + w + v; 

    // Calling the curried functions 

    // Calling Curried Function for Adding u, v & w 
    System.out.println("Add 2, 3, 4 :"
                       + triadder 
                             .apply(2) 
                             .apply(3) 
                             .apply(4));

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Java не подходит для такого подхода. Другие языки делают это проще. В Java, Object Oriented - это путь, с идеями функционального программирования, приправляющие его только в определенных случаях, когда это действительно необходимо.

«Частичное приложение » - более общая концепция, чем каррирование,Это означает предоставление функции, которая содержит некоторые данные в своем закрытии - вызывающая сторона предоставляет другой параметр.

Это можно сравнить с объектом Java, который «захватывает» поле, затем предлагает метод, который использует это поле, идругой параметр.

«Карринг» более конкретно реструктурирует функцию с несколькими параметрами в функции одного параметра. Это делается путем захвата всех параметров, кроме одного, оставляя другие параметры для последующих вызовов.

«Функциональная декомпозиция» - это анализ, который разбивает сложный процесс на простые функции, эквивалентные функциональному программированию объектно-ориентированного проектирования.

0 голосов
/ 05 ноября 2019

В дополнение к ответу @ 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 # автоматически каррирует функции, делает простой способ сделать ваш код чище и проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...