Как <*> может принимать функции в контексте с большим количеством параметров в Haskell? - PullRequest
0 голосов
/ 02 марта 2020

Функция <*> имеет тип Applicative f => f (a -> b) -> fa -> fb, но она может принимать первый аргумент функции в контексте с большим количеством аргументов (f (a -> b -> c)). Да, есть карри, и все же, почему haskell принимает это?

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Да, карри.

Это работает, потому что не существует такого понятия, как функция с несколькими аргументами. A->B->C это технически говоря тип функций с единственным аргументом типа A. Результатом этих функций снова является тип функции B->C, но первая <*> не заботится об этом. next <*> может заботиться об этом и связывать аргумент B, но это отдельный шаг.

1 голос
/ 02 марта 2020

Yes, there is currying

и это буквально все, что нужно сделать.

Функция типа a -> b -> c на самом деле имеет тип a -> (b -> c) - оба они полностью эквивалентны, из-за карри.

Итак, подпись <*>, как вы говорите, Applicative f => f (a -> b) -> f a - > f b. Но если b также является типом функции, скажем, c -> d, то это может быть специализация:

Applicative f => f (a -> c -> d) -> f a - > f (c -> d)

и т. Д., Если окажется, что d на самом деле само по себе тип функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...