Функциональное программирование: Curry & Fold - каковы этимологии?
2 ответа
Я полагаю, что термин "сложить" происходит в основном от использования слова "сложить" в таких словах, как "сложить в...", который, как я полагаю, чаще всего используется поварами (я смотрю множество кулинарных шоу...). Мы используем его в контексте функционального программирования, потому что мы говорим, что, например, для списков, заголовок списка "складывается" в результат складывания хвоста. Например, функция foldr
это "рецепт" для того, как "приготовить" список, и часть этого рецепта "сложить в это", если хотите.
Самая старая ссылка на "сворачивание", которую я смог найти в Интернете в контексте функционального программирования в этом отчете, опубликованном в 1985 году Кембриджским университетом, в котором говорится следующее:
Функция collect применяет функцию двух аргументов "между" каждым элементом списка и значением терминала. [...] Эта функция также известна как уменьшение или сворачивание в других языках.
Очевидно, что термин "сгиб" был хотя бы несколько распространен даже 30 лет назад!
Карри - фамилия Хаскелла Карри, известного логика 20-го века, в честь которого Хаскелл получил свое имя.
И "сворачивание" просто потому, что оператор сгиба образно представляет собой фолд, как карточная рука может быть сложена, чтобы выглядеть как одна карта. Думать о foldr (+) 0 [1,2,3] == 6
как рука карт 1, 2 и 3, сложенная в одну карту 6.
Слово "сокращение", которое также означает сворачивание, может быть проиллюстрировано с использованием аналогичной аналогии.
Конечно, Haskell более волшебен, чем даже самая блефующая и удачливая игра в покер, поэтому сгибы в функциональном программировании могут фактически создать колоду карт, которая содержит больше карт, чем рука, из которой она была сложена, или карты могут быть сложены в кошек и т. Д.: foldr (\i, acc -> [show i,show i,show i] ++ acc) [] [1,2,3] == ["1","1","1","2","2","2","3","3","3"]
, Поэтому то, что начиналось как складывание, в конечном итоге превратилось в чрезвычайно универсального оператора, который может производить map
так же как filter
и т.д., так что не увлекайтесь сравнением покера и этимологией.
Что касается того, как назвать их: переименование мертвого человека может быть не самым этичным, что нужно сделать. Бедняга настолько успешен, КАК его имена используются для больших вещей, а потом вы хотите посмертно лишить его его радости и переименовать в другое? Если, возможно, что-то еще - это Ньютон Уотт Сковилл или Кельвин Цельсий Ангстрем, я бы не стал серьезно пытаться переименовать.
Однако, если вы имели в виду переименование концепции программирования: вместо этого на мой взгляд, ее можно назвать именем "ricing". Но мистер Карри все еще может чувствовать страх.
На самом деле сворачивание может быть переименовано в блеф, если вы не удовлетворены множеством доступных для него имен - спасибо som-snytt за конструктивную идею.