Практическое использование каррированных функций?

Не не соглашаться с людьми, которые говорят "материал записи", но одну тему, что необходимо узнать о следующем, - базовые основные принципы CLR - работы механизма, который находится позади всех этих библиотек. Хорошим ресурсом для этого является "CLR Richter Через C#".

29
задан Philip Seyfi 3 February 2011 в 18:35
поделиться

4 ответа

Они могут сделать код проще для чтения. Рассмотрим следующие два фрагмента Haskell:

lengths :: [[a]] -> [Int]
lengths xs = map length xs

lengths' :: [[a]] -> [Int]
lengths' = map length

Зачем давать имя переменной, которую вы не собираетесь использовать?

Функции с каррированием также помогают в подобных ситуациях:

doubleAndSum ys = map (\xs -> sum (map (*2) xs) ys

doubleAndSum' = map (sum . map (*2))

Удаление этих дополнительных переменных облегчает чтение кода, и вам не нужно мысленно понимать, что такое xs и что такое ys.

НТН.

11
ответ дан 28 November 2019 в 01:40
поделиться

Я думаю, что карри является традиционным способом обработки общих n-арных функций, при условии, что единственные, которые вы можете определить, являются унарными.

Например, в лямбда-исчислении (из которого происходят функциональные языки программирования), есть только абстракции с одной переменной (что переводит в унарные функции в FPL). Что касается лямбда-исчисления, я думаю, что легче доказать вещи о таком формализме, так как на самом деле вам не нужно обрабатывать случай n-арных функций (поскольку вы можете представить любую n-арную функцию с рядом унарных функций посредством каррирования) .

(Другие уже рассмотрели некоторые практические последствия этого решения, поэтому я остановлюсь здесь.)

3
ответ дан 28 November 2019 в 01:40
поделиться

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

2
ответ дан 28 November 2019 в 01:40
поделиться

Само по себе карри является синтаксическим сахаром. Синтаксический сахар - это то, что вы хотите сделать легким. C, например, хочет сделать инструкции, которые являются «дешевыми» на ассемблере, такие как инкрементные, простые и поэтому они имеют синтаксический сахар для приращения, нотацию ++.

 t = x + y
 x = x + 1

заменяется на t = x ++ + y

Функциональные языки могут так же легко иметь такие вещи, как.

f(x,y,z) = abc 
g(r,s)(z) = f(r,s,z). 
h(r)(s)(z) = f(r,s,z)

, но вместо этого все это автоматически. И это позволяет передать границу g определенным r0, s0 (то есть определенными значениями) как функцию с одной переменной.

Возьмем, к примеру, функцию сортировки perl, которая принимает подсписок сортировки, где sub - это функция двух переменных, которая вычисляется как логическое значение, а list - произвольный список.

Естественно, вы захотите использовать операторы сравнения (< =>) в Perl и иметь sortordinal = sort (< =>), где sortordinal работает со списками. Чтобы сделать это, вы бы выбрали функцию карри.
И на самом деле вид списка определяется именно таким образом в Perl.

Вкратце: карри - это сахар, чтобы сделать первоклассные функции более естественными.

0
ответ дан 28 November 2019 в 01:40
поделиться