Как Хаскелл добавил Тьюринг-полноту в систему F?

Я читал о различных системах типов и лямбда-исчислениях, и я вижу, что все типизированные лямбда-исчисления в лямбда-Кубе сильно нормализуя вместо эквивалента Тьюринга. Это включает в себя систему F, просто типизированное лямбда-исчисление плюс полиморфизм.

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

  • как формализм (например) Haskell отличается от исчисление, на котором оно якобы основано?
  • какие языковые особенности в Haskell не подпадают под формализм системы F?
  • каково минимальное изменение, необходимое для полного вычисления Тьюринга?

большое спасибо тем, кто помогает мне понять это.

1 ответов


одним словом, общая рекурсия.

Haskell допускает произвольную рекурсию, в то время как система F не имеет формы рекурсии. Отсутствие бесконечных типов означает fix не выражается как закрытый термин.

нет примитивного понятия имен и рекурсии. На самом деле, чистая система F не имеет понятия о такой вещи, как определения!

Итак, в Haskell это единственное определение-это то, что добавляет полноту Тьюринга

fix :: (a -> a) -> a
fix f = let x = f x in x

правда это функция указывает на более общую идею, имея полностью рекурсивные привязки, мы получаем полноту Тьюринга. Обратите внимание, что это относится к типам, а не только значения.

data Rec a = Rec {unrec :: Rec a -> a}

y :: (a -> a) -> a
y f = u (Rec u)
  where u x = f $ unrec x x

с бесконечными типами мы можем написать комбинатор Y (по модулю некоторого развертывания) и через него общую рекурсию!

ядро терминов Хаскелла без любое понятие let, where или = сильно нормализует, так как у нас нет бесконечных типов. Даже этот основной термин исчисление не действительно System F. System F имеет" большие лямбды " или абстракцию типа. Полный срок id в системе F есть

id := /\ A -> \(x : A) -> x

это потому, что вывод типа для системы F неразрешим! Мы явно обозначаем, где и всякий раз, когда мы ожидаем полиморфизма. В Haskell такое свойство будет раздражать, поэтому мы ограничиваем власть Haskell. В частности, мы никогда вывести полиморфный тип для лямбда-аргумента Haskell без аннотации (могут применяться условия). Вот почему в ML и Haskell

let x = exp in foo

не аналогично

(\x -> foo) exp

, даже если exp не рекурсивно! Это суть вывода типа HM и алгоритма W, называемого " пусть обобщение."