Я искал в Интернете, и я не могу найти никаких объяснений CHI, которые не быстро вырождаются в лекцию по логической теории, которая резко над моей головой. (Эти люди говорят, будто "интуиционистское исчисление предложений" - это фраза, которая на самом деле означает что-то для нормальных людей!)
Грубо говоря, CHI говорит, что типы - это теоремы, а программы - доказательства этих теорем. Но что, черт возьми, это даже означает?
До сих пор я понял это:
-
Рассмотрим
id :: x -> x
. Его тип говорит "учитывая, что X истинно, мы можем заключить, что X истинно". Мне кажется разумной теоремой. -
Теперь рассмотрим
foo :: x -> y
. Как скажет вам любой программист Haskell, это невозможно. Вы не можете записать эту функцию. (Ну, не обманывая.) Прочитайте как теорему, она говорит: "учитывая, что любое X истинно, мы можем заключить, что любой Y истинно". Это, очевидно, вздор. И, конечно же, вы не можете написать эту функцию. -
В общем случае аргументы функции можно считать "это, которые считаются истинными", а тип результата можно считать "вещью, которая истинна, если все остальные вещи будут". Если есть аргумент функции, скажем
x -> y
, мы можем считать, что в качестве предположения, что X является истинным, подразумевается, что значение Y должно быть истинным. -
Например,
(.) :: (y -> z) -> (x -> y) -> x -> z
можно взять как "предполагая, что Y влечет Z, что X влечет Y, а X истинно, мы можем заключить, что Z истинно". Что кажется логически разумным для меня.
Теперь, что, черт возьми, означает Int -> Int
? о_О
Единственный разумный ответ, который я могу придумать, таков: если у вас есть функция X → Y → Z, то сигнатура типа говорит "если предположить, что можно построить значение типа X, а другое типа Y, то можно построить значение типа Z". И тело функции точно описывает, как вы это сделаете.
Это, кажется, имеет смысл, но это не очень интересно. Так ясно должно быть больше, чем это...