let a = b in c
можно рассматривать как синтаксический сахар для (\a -> c) b
, но в типизированной настройке вообще это не так. Например, в исчислении Милнера let a = \x -> x in (a True, a 1)
является типичным, но, по-видимому, эквивалентным (\a -> (a True, a 1)) (\x -> x)
не является.
Однако последний является типичным в System F с типом ранга 2 для первой лямбда.
Мои вопросы:
-
Является ли полиморфизм признаком 2-го уровня, который тайно прокрался в мир ранга 1 другого уровня Милнера?
-
Цель создания отдельной конструкции
let
, по-видимому, указывает, какие типы должны быть обобщены с помощью проверки типа, а какие нет. Выполняет ли это какие-либо другие цели? Существуют ли какие-либо причины для расширения более мощных систем, например. Система F с отдельнойlet
, которая не является сахаром? Существуют ли какие-либо документы по обоснованию конструкции исчисления Милнера, которые мне кажутся не очевидными? -
Существует ли наиболее общий тип для
\a -> (a True, a 1)
в System F? -
Существуют ли системы типов, закрытые при бета-расширении? То есть если P является типичным и M N = P, то M является типичным?
Некоторые пояснения:
-
Под эквивалентностью я подразумеваю аннотации эквивалентности по модулю. Является ли "система F a la Church" правильным термином для этого?
-
Я знаю, что в общем случае основное свойство typing не выполняется в F, но для моего конкретного члена может существовать главный тип.
-
Под
let
я имею в виду нерекурсивный вкусlet
. Расширение системы F с рекурсивным let, очевидно, полезно, поскольку оно допускает прерывание.