Взаимозаменяемы ли в Haskell концепции частичного применения и каррирования?

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

Читая книгу Learn You a Haskell for Good Good, автор, похоже, применяет эти взаимозаменяемо.

[Каррированные функции] Каждая функция в Haskell официально принимает только один параметр.

...

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

У меня вопрос: Взаимозаменяемы ли в Haskell концепции частичного применения и каррирования?


person hawkeye    schedule 20.06.2016    source источник
comment
Честный ответ краток, и это да.   -  person hao    schedule 20.06.2016
comment
Для меня каррирование связано с определением функции, тогда как частичное приложение связано с вызовом функции. Таким образом, они не в точности взаимозаменяемы, но представляют собой две стороны одной медали, и ни один из них не имеет смысла без другого. Когда вы говорите, что они похожи, но отличаются в некоторых функциональных языках, что именно вы имеете в виду?   -  person ruakh    schedule 20.06.2016
comment
Также интересно отметить, что, хотя система типов имеет дело исключительно с каррированными унарными функциями, функции в сгенерированном коде GHC принимают несколько аргументов; закрытия предназначены только для частично применяемых функций. Это возможно, потому что код был проверен типом в соответствии с каррированной интерпретацией, которая изоморфна неторопливой интерпретации, то есть это оптимизация с сохранением типа.   -  person Jon Purdy    schedule 21.06.2016


Ответы (1)


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

Процесс каррирования заменяет N-арную функцию N «слоями» унарных функций, чтобы вы могли частично применить ее, включив

function(x,y) {return x+y;}

в

function(x) {return function(y) {return x+y;};}

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

person amalloy    schedule 20.06.2016