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
Mariusz 25 Апр 2017 в 05:03

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)
3
duplode 25 Апр 2017 в 03:18

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

((a, b) -> c)

То есть функция, которая принимает один аргумент: пару вещей a и b и возвращает другую вещь c. Карри делает что-то магическое с этой функцией и превращает ее в новую функцию:

(a -> b -> c)

То есть функция, которая принимает два аргумента: вещь a и вещь b и возвращает вещь c.

Итак, код:

curry f a b

Как:

let newFunction = curry(f)
newFunction a b

По сути, карри преобразует функцию, которая принимает пару в функцию, которая вместо этого принимает эту пару в качестве двух аргументов.

1
Elliot E 25 Апр 2017 в 03:03
43600394