Чтение Хаскелла Тип

64
10

допустим, у меня есть:

t = \x y  -> x.y 

его тип тогда:

*Main> :t t
t :: (b -> c) -> (a -> b) -> a -> c

Если я правильно понял, xy может быть записано как x(y), что означает, что мы сначала решаем y который является (b → c) а затем x, который является (b → a) и a → c просто являются параметрами в функция; Мы даем a (x) и c (y). Это правильно? Если нет, то как мне это прочитать? что означает (b → c) → (a-> b) и какой из них x какой из y.

И как мне это прочитать:

t1 = \x y z -> x.y.z 

*Main> :t t1
t1 :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c

Что здесь b1 что b2 и как это работает? Почему в и просто → с, когда у меня есть 3 параметра в качестве ввода? Пожалуйста, помогите мне понять это

спросил(а) 2021-01-25T14:26:09+03:00 4 месяца, 4 недели назад
1
Решение
63

Лучший способ написать тип функции (b → c) → (a → b) → a → c это (b → c) → (a → b) → (a → c) где есть круглые скобки (a → c). Это переписывание пытается прояснить, что функция не принимает три аргумента и возвращает что-то типа c. Он принимает два аргумента и возвращает функцию типа (a → c). Это концепция карри, и она является неотъемлемой частью программирования на Haskell 1 .

В вашем первом примере (b → c) - это x а (a → b) - это y. Тип возврата (a → c) - это новая функция, полученная составлением функций параметров.

Ваш второй пример может быть интерпретирован таким же образом. (b1 → c) соответствует x, (b2 → b1) - y а (a → b2) - z. Возвращаемый тип получается сначала составлением z и y чтобы получить функцию типа (a → b1) затем составлением этой функции с a чтобы получить функцию типа (a → c). Эта функция является тем, что в конечном итоге возвращается.

1: На самом деле наиболее правильно сказать, что функция принимает один аргумент типа (b → c) и возвращает функцию типа (a → b) → (a → c) но это не особенно важно ,

ответил(а) 2021-01-25T14:26:09+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема