Как Хаскелл добавил Тьюринг-полноту в систему 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, называемого " пусть обобщение."