Какой тип математики это: а -> б -> с

Я часто вижу объявления типа, похожие на это, когда смотрю на Haskell:

a -> (b -> c)

Я понимаю, что она описывает функцию, которая принимает что-то типа a и возвращает новую функцию, которая принимает что-то типа b и возвращает что-то типа c. Я также понимаю, что типы являются ассоциативными (отредактируйте: я был неправ в этом - см. Комментарии ниже), поэтому вышеприведенное можно переписать так, чтобы получить тот же результат:

(a -> b) -> c

Это описало бы функцию, которая принимает что-то типа a и что-то типа b и возвращает что-то типа c.

Я также слышал, что вы можете сделать дополнение (редактировать: действительно, слово, которое я искал здесь, двойственное - см. Комментарии ниже) к функции, переключая стрелки:

a <- b <- c

который я думаю эквивалентен

c -> b -> a

но я не уверен.

У меня вопрос, как называется этот вид математики? Я хотел бы узнать больше об этом, чтобы я мог использовать его, чтобы помочь мне писать лучшие программы. Я заинтересован в изучении таких вещей, как дополнительная функция и какие другие преобразования могут быть выполнены в объявлениях типов.

Спасибо!

4 ответа

Решение

В широком смысле это относится к сфере лямбда-исчисления.

Поскольку эта нотация связана с типами функций, вывод типов может быть также интересен для вас.

(Неправильные предположения, которые вы сделали относительно ассоциативности, уже должны быть достаточно прояснены другими ответами, поэтому я не буду повторять это)

Объявления типов не являются ассоциативными, a -> (b -> c) не эквивалентно (a -> b) -> c, Кроме того, вы не можете "переключать" стрелки, a <- b <- c неверный синтаксис

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

a -> (b -> c) 

а также

(a -> b) -> c

не эквивалентны в Haskell. Это теория типов, которая может быть основана на теории категорий.

Первая - это функция, принимающая аргумент типа a и возвращая функцию типа b -> c, В то время как последний является функцией, принимающей функцию типа a -> b в качестве аргумента и возвращая значение типа c,

Что вы подразумеваете под дополнением к функции? Тип обратной функции функции типа a -> (b -> c) имеет тип (b -> c) -> a,

Функции типа a->b->c, которые на самом деле являются цепочками функций, как вы сказали, являются примерами карри

Другие вопросы по тегам