Что такое «карри»?

Это легкое решение сработало для меня:

public class MyObject {
    private Object rawJsonValue;

    public Object getRawJsonValue() {
        return rawJsonValue;
    }

    public void setRawJsonValue(Object rawJsonValue) {
        this.rawJsonValue = rawJsonValue;
    }
}

Таким образом, я смог сохранить исходное значение JSON в переменной rawJsonValue, и тогда не было никакой проблемы десериализовать его (как объект) с другими полями назад к JSON и отправить через мой REST. Использование @JsonRawValue мне не помогло, потому что сохраненный JSON был десериализован как String, а не как объект, и это было не то, что я хотел.

598
задан 030 27 April 2017 в 18:35
поделиться

9 ответов

Приправление карри состоит в том при разрушении функции, которая берет несколько аргументов в серию функций, что каждый берет только один аргумент. Вот пример в JavaScript:

function add (a, b) {
  return a + b;
}

add(3, 4); // returns 7

Это - функция, которая берет два аргумента, a и b, и возвращает их сумму. Мы теперь приправим эту функцию карри:

function add (a) {
  return function (b) {
    return a + b;
  }
}

Это - функция, которая берет один аргумент, a, и возвращает функцию, которая берет другой аргумент, b, и что функция возвращает их сумму.

add(3)(4);

var add3 = add(3);

add3(4);

первый оператор возвращается 7, как добавление (3, 4) оператор. Второй оператор определяет новую функцию, вызванную add3, который добавит 3 к его аргументу. Это - то, что некоторые люди могут назвать закрытием. Третий оператор использует add3 операцию для добавления 3 - 4, снова производя 7 в результате.

785
ответ дан Maarten ten Velden 27 April 2017 в 18:35
поделиться

Приправление карри является преобразованием, которое может быть применено к функциям, чтобы позволить им брать ту меньше аргумента, чем ранее.

, Например, в F# можно определить функциональный thus:-

let f x y z = x + y + z

, Здесь функционируют, f берет параметры x, y и z и суммирует их вместе Возвраты so:-

f 1 2 3

6.

Из нашего определения мы можем, может поэтому определить функцию карри для f:-

let curry f = fun x -> f x

, Где 'забава x-> f x' является функцией лямбды equivilent к x => f (x) в C#. Эта функция вводит функцию, которую Вы хотите приправить карри, и возвращает функцию, которая берет отдельный аргумент и возвращает указанную функцию с первым набором аргумента к входному параметру.

Используя наш предыдущий пример мы можем получить карри f thus:-

let curryf = curry f

, Мы можем тогда сделать following:-

let f1 = curryf 1

, Который предоставляет нам функцию f1, который является equivilent к f1 y z = 1 + y + z. Это означает, что мы можем сделать following:-

f1 2 3

, Который возвращается 6.

Этот процесс часто путается с 'частичным функциональным приложением', которое может быть определенным thus:-

let papply f x = f x

, Хотя мы можем расширить его больше чем до одного параметра, т.е..:-

let papply2 f x y = f x y
let papply3 f x y z = f x y z
etc.

А частичное приложение возьмет функцию и параметр (параметры) и возвратит функцию, которая требует одного или нескольких меньшего количества параметров, и поскольку предыдущие два шоу в качестве примера реализованы непосредственно в стандартном определении функции F#, таким образом, мы могли достигнуть предыдущего thus:-

let f1 = f 1
f1 2 3

результата, Который возвратит результат 6.

В conclusion:-

различие между приправлением карри и частичным функциональным приложением является that:-

Приправляющие карри взятия функция и обеспечивает новую функцию, принимающую отдельный аргумент и возвращающую указанную функцию с ее первым набором аргумента к тому аргументу. Это позволяет нам представлять функции с несколькими параметрами как серия функций отдельного аргумента . Example:-

let f x y z = x + y + z
let curryf = curry f
let f1 = curryf 1
let f2 = curryf 2
f1 2 3
6
f2 1 3
6

Частичное функциональное приложение является более прямым - оно берет функцию и один или несколько аргументов и возвращает функцию с первым n набором аргументов к n определенным аргументам. Example:-

let f x y z = x + y + z
let f1 = f 1
let f2 = f 2
f1 2 3
6
f2 1 3
6
46
ответ дан Orkhan Alikhanov 27 April 2017 в 18:35
поделиться

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

27
ответ дан Jon Harrop 27 April 2017 в 18:35
поделиться

Это эквивалентно тому, что неравнодушный делает в Python. Когда мы хотим использовать родовую функцию для сфокусированной цели, мы фиксируем подмножество параметров с помощью этого механизма.

-1
ответ дан 22 November 2019 в 21:53
поделиться

Вот пример дженерика и самой короткой версии для функции, приправляющей карри с n нет. из параметрических усилителей.

const add = a => b => b ? add(a + b) : a; 

const add = a => b => b ? add(a + b) : a; 
console.log(add(1)(2)(3)(4)());
0
ответ дан 22 November 2019 в 21:53
поделиться

Я нашел эту статью и статью, на которую она ссылается, полезной для лучшего понимания каррирования: http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx

Как уже упоминалось другими, это всего лишь способ получить функция с одним параметром.

Это полезно, поскольку вам не нужно предполагать, сколько параметров будет передано, поэтому вам не нужны функции с двумя параметрами, с тремя параметрами и с четырьмя параметрами.

3
ответ дан 22 November 2019 в 21:53
поделиться

Вот конкретный пример:

Предположим, у вас есть функция, которая вычисляет гравитационную силу, действующую на объект. Если вы не знаете формулу, вы можете найти ее здесь . Эта функция принимает в качестве аргументов три необходимых параметра.

Теперь, находясь на Земле, вы хотите вычислить силы только для объектов на этой планете. На функциональном языке вы можете передать функции массу земли, а затем частично ее оценить. Вы получите еще одну функцию, которая принимает только два аргумента и вычисляет гравитационную силу объектов на Земле. Это называется каррированием.

96
ответ дан 22 November 2019 в 21:53
поделиться

В алгебре функций работа с функциями, которые принимают несколько аргументов (или эквивалентный один аргумент, состоящий из N-кортежей), несколько неэлегантно, но, как доказал Мозес Шенфинкель (и, независимо, Хаскелл Карри), в этом нет необходимости: все вам нужны функции, которые принимают один аргумент.

Так как же поступить с тем, что вы естественным образом выразили бы как, скажем, f (x, y) ? Что ж, вы примете это как эквивалент f (x) (y) - f (x) , назовите его g , это функция, и вы примените эту функцию к и . Другими словами,

124
ответ дан 22 November 2019 в 21:53
поделиться

Here's a toy example in Python:

>>> from functools import partial as curry

>>> # Original function taking three parameters:
>>> def display_quote(who, subject, quote):
        print who, 'said regarding', subject + ':'
        print '"' + quote + '"'


>>> display_quote("hoohoo", "functional languages",
           "I like Erlang, not sure yet about Haskell.")
hoohoo said regarding functional languages:
"I like Erlang, not sure yet about Haskell."

>>> # Let's curry the function to get another that always quotes Alex...
>>> am_quote = curry(display_quote, "Alex Martelli")

>>> am_quote("currying", "As usual, wikipedia has a nice summary...")
Alex Martelli said regarding currying:
"As usual, wikipedia has a nice summary..."

(Just using concatenation via + to avoid distraction for non-Python programmers.)

Editing to add:

See http://docs.python.org/library/functools.html?highlight=partial#functools.partial, which also shows the partial object vs. function distinction in the way Python implements this.

6
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: