curry f a b = f(a,b)
Я подумал: функция карри принимает функцию f a b и возвращает f (a, b), поэтому я подумал, что тип:
(a -> b -> c) -> (a, b) -> c
Так почему тип поменялся местами?
((a, b) -> c) -> (a -> b -> c)
2 ответа
Я считаю, что источником вашего замешательства является этот отрывок:
функция карри принимает функцию f a b
Не совсем: curry
принимает функцию, а эта функция f
. Что касается a
и b
, они являются аргументами, которые передаются в функцию карри. Это легче увидеть, добавив пару лишних скобок, чтобы частичное применение стало более очевидным ...
(curry f) a b = f (a,b)
... или сдвигая a
и b
вправо с помощью лямбды:
curry f = \a b -> f (a,b)
f
- это функция, которая принимает пару - обратите внимание, что мы даем ей пару (a,b)
. curry f
, с другой стороны, принимает два аргумента отдельно. В таком случае тип curry
действительно такой:
curry :: ((a, b) -> c) -> (a -> b -> c)
Карри принимает только один аргумент, который является функцией, и возвращает функцию. Этот аргумент является функцией с подписью
((a, b) -> c)
То есть функция, которая принимает один аргумент: пару вещей a и b и возвращает другую вещь c. Карри делает что-то магическое с этой функцией и превращает ее в новую функцию:
(a -> b -> c)
То есть функция, которая принимает два аргумента: вещь a и вещь b и возвращает вещь c.
Итак, код:
curry f a b
Как:
let newFunction = curry(f)
newFunction a b
По сути, карри преобразует функцию, которая принимает пару в функцию, которая вместо этого принимает эту пару в качестве двух аргументов.
Похожие вопросы
Новые вопросы
haskell
Haskell - это функциональный язык программирования, отличающийся строгой статической типизацией, отложенной оценкой, обширной поддержкой параллелизма и параллелизма и уникальными возможностями абстракции.