Не не соглашаться с людьми, которые говорят "материал записи", но одну тему, что необходимо узнать о следующем, - базовые основные принципы CLR - работы механизма, который находится позади всех этих библиотек. Хорошим ресурсом для этого является "CLR Richter Через C#".
Они могут сделать код проще для чтения. Рассмотрим следующие два фрагмента 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.
НТН.
Я думаю, что карри является традиционным способом обработки общих n-арных функций, при условии, что единственные, которые вы можете определить, являются унарными.
Например, в лямбда-исчислении (из которого происходят функциональные языки программирования), есть только абстракции с одной переменной (что переводит в унарные функции в FPL). Что касается лямбда-исчисления, я думаю, что легче доказать вещи о таком формализме, так как на самом деле вам не нужно обрабатывать случай n-арных функций (поскольку вы можете представить любую n-арную функцию с рядом унарных функций посредством каррирования) .
(Другие уже рассмотрели некоторые практические последствия этого решения, поэтому я остановлюсь здесь.)
Мы не можем напрямую составлять функции, которые принимают несколько параметров. Поскольку составление функций является одним из ключевых понятий в функциональном программировании. Используя технику каррирования, мы можем составлять функции, которые принимают несколько параметров.
Само по себе карри является синтаксическим сахаром. Синтаксический сахар - это то, что вы хотите сделать легким. 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.
Вкратце: карри - это сахар, чтобы сделать первоклассные функции более естественными.