Введіть умовивід для імперативних висловлювань, крім призначення


10

У моєму пошуку наукових праць щодо типів систем імперативних мов я знаходжу рішення лише для мови з змінними посиланнями, але без справжніх імперативних структур управління, таких як складові оператори, цикли або умовні умови.

Тож незрозуміло, як може бути реалізована імперативна мова з частковим висновком типу, наприклад http://rust-lang.org .

У документах не згадуються параметризовані типи, наприклад, List of aтому, що параметризовані типи є тривіальним розширенням системи типу Хіндлі-Мілнера - лише алгоритм об'єднання повинен бути розширений, а решта висновків працює як є. Однак призначення не можна тривіально додавати, оскільки виникають парадокси, тому необхідно застосовувати спеціальні методи, такі як обмеження значення ML.

Чи можете ви порекомендувати будь-які папери чи книги, що описують систему типів для мови з імперативними петлями, умовними умовами, виведеннями та складними висловлюваннями?


4
Я не впевнений, що я розумію джерело вашого запитання, частково тому, що Standard ML насправді має складні оператори, цикли та умовні умови (один приклад рядка:) let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end. Отже, на рівні дослідницького питання, чи є відповідь, яку ви шукаєте, "застосовувати методи, розроблені в Caml / SML, включаючи обмеження значення"?
Роб Сіммонс

Питання полягало в тому, "які документи про методи, розроблені для Caml / SML, ви рекомендуєте?"
nponeccop

Гаразд - я це зрозумів, і збирався спробувати відредагувати своє останнє речення, щоб сказати: "Це те, що ти шукаєш доступну довідку для висновку типу Хіндлі-Мілнер, як це використовується в ML?" І тоді я потрапив на 5-хвилинну межу редагування :-)
Роб Сіммонс

Відповіді:


14

Якщо ви шукаєте акуратне, функціональне посилання на висновок про тип, я трохи частково ставлюся до "Виводу типу в контексті " Gundry, McBride та McKinna 2010 року , хоча це може бути не гарним посібником щодо будь-яких фактичних існуючих реалізацій .

Я думаю, що частина відповіді полягає в тому, що поза обмеженням значення, насправді не так вже й багато труднощів у адаптації висновку типу Хіндлі-Мілнера до імперативних мов: якщо ви визначаєте e1; e2як синтаксичний цукор (fn _ => e2) e1і визначаєте while e1 do e2як синтаксичний цукор для whiledo e1 (fn () => e2), де whiledoрегулярний рекурсивна функція

fun whiledo g f = if g then (f (); whiledo g f) else ();

тоді все буде добре, включаючи умовиводи.

Що стосується обмеження значення як особливої ​​техніки, мені подобається наступна історія; Я майже впевнений, що взяв його у Карла Крарі. Розглянемо наступний код, обмеження значення якого не дозволить вам писати в ML:

let
   val x: 'a option ref = ref NONE
in
   (x := SOME 5; x := SOME "Hello")  
end

Порівняйте його із наступним кодом, що абсолютно непроблемно:

let
   val x: unit -> 'a option ref = fn () => ref NONE
in
   (x () := SOME 5; x () := SOME "Hello")  
end

Ми знаємо, що робить другий приклад: він створює дві нові клітинки ref, що містять NONE, потім ставить SOME 5у першу (an int option ref), потім ставить SOME "Hello"у другу (a string option ref).

xxα.реф(варіант(α))xΛα.реф[α](НІКОЛИ)

Це наводить на думку про те, що одна "хороша" поведінка першого прикладу повинна вести себе точно так само, як веде другий приклад - інстанціювати лямбда на рівні типу два рази. У перший раз ми створюємо xз int, що змусить x [int]оцінити з еталонною кюветой , NONEа потім SOME 5. Другий раз ми створюємо xз string, який буде регістр x [string]для оцінки до ( різні! ) Посиланням кюветі , NONEа потім SOME "Hello". Така поведінка "правильна" (безпечна для типу), але це точно не те, чого очікував програміст, і саме тому ми маємо обмеження значення в ML, щоб уникнути програмістів, які займаються такою несподіваною поведінкою.


1
Ваша зневірена версія e1; e2містить невідповідні дужки та крапку з комою (яку слід визначити). Ви мали на увазі (fn _ => e2) e1?
Цуйосі Іто

Право-о, Цюсі: фіксовано.
Роб Сіммонс

Ваш останній абзац в основному говорить: (оперативна) семантика і система типів не збігаються, їх потрібно виправити, і ми вирішимо виправити останній.
Раду ГРИГо

Раду: звичайно, я згоден з цим підсумком.
Роб Сіммонс

3

Кандидатська дисертація Ксав'є Леру є вдалим початком.


1
Дисертація не охоплює імперативні петлі, умовні умови, IO та складені заяви, чи не так? Основна причина мого запитання полягала в тому, що я не міг знайти робіт, які б висвітлювали ці теми. Документи про набір завдань рясні.
nponeccop

0

Вибачте за те, що я не відповів на власне запитання, але посилання на нього є

Пропозиція до стандарту ML , Milner, 1983

Частина 6 "Стандартні похідні форми" досить широко висвітлює знешкодження імперативних конструкцій. І поки що це найдавніше посилання на ці багато очевидні трансформації, які я міг знайти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.