Типові умовиводи, засновані на обмеженнях, з алгебраїчними даними


11

Я працюю над мовою генеалогії ML, заснованої на виразі, тому вона, природно, потребує введення тексту> :)

Зараз я намагаюся розширити рішення на основі обмежень для проблеми випливаючих типів, що базується на простому впровадженні в EOPL (Friedman and Wand), але вони елегантно є алгебраїчними типами даних бічного кроку.

Те, що я маю дотепер, працює безперебійно; якщо вираз eє a + b, e : Int, a : Intі b : Int. Якщо eце збіг,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

Я правильно можу зробити висновок про те t(e) = t(the whole match expression), що t(n) = t(0) = t(n'), t(match) = t(1) = t(n' * fac(n - 1)і так далі ...

Але я дуже не впевнений, що стосується алгебраїчних типів даних. Припустимо, така функція, як фільтр:

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

Щоб тип списку залишався поліморфним, Мінуси повинні мати тип a * a list -> a list. Отже, встановлюючи ці обмеження, я, очевидно, потрібно шукати ці типи моїх алгебраїчних конструкторів - проблема, яку я зараз маю, - це "чутливість до контексту" багаторазового використання алгебраїчних конструкторів - як я висловлюю в своїх обмеженнях рівняння, що aв кожен випадок повинен бути однаковим?

У мене виникають проблеми з пошуком загального рішення цього питання, і я не можу знайти багато літератури з цього приводу. Щоразу, коли я знаходжу щось подібне - мову, засновану на висловленні, на основі обмежень, - вони зупиняються лише від алгебраїчних типів даних та поліморфізму.

Будь-який вклад дуже цінується!


@Guy, я не хочу звучати невдячно, але я не шукаю рішення, яке можна продати за рамками, - у вас є якісь пропозиції? Більшість існуючих у мене документів (наприклад, документи INRIA про ML, OCaml ...) набагато більш масштабні, ніж те, що мені потрібно (і я здатний зрозуміти).
Кріс

Я б почав із глави висновку в ATTAPL , я думаю, що вони обговорюють все необхідне на доступному рівні.
Жил "ТАК - перестань бути злим"

@Gilles Я думаю, що ATTAPL є єдиною "класичною" книгою PL, яку я не маю на своїй книжковій полиці: P Але, дякую, я погляну в понеділок, я сиджу на підлозі в Уні, можливо, 10 примірників, розповсюджених по офісах: )
Кріс

@Kris Ви коли-небудь знаходили доступний ресурс для вирішення цієї проблеми? Моя реалізація "міні-ML" застрягла саме в цій проблемі ... Я думаю, що я знайшов відповідну главу з ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) і продемонстрував розділ про алгебраїку типи даних, але я боюся, що це трохи над головою.
michiakig

@spacemanaki Так, я з тих пір знайшов pdfs.semanticscholar.org/8983/… чудовим ресурсом саме для цього.
Кріс

Відповіді:


2

Див.: Міні-ML, зокрема, розділ Висновок типу.

Він містить зразковий код у F # для повного розбору простої функціональної мови. Більш важливо, що розділ Type Inference реалізує алгоритм Гіндлі-Мілнера, який є в більшості типів системи виводу. Автор також надає посилання на два інші важливі документи, які допоможуть зрозуміти Хіндлі-Мілнер; один - це введення на високому рівні, а другий - документ, що описує реалізацію алгоритму в коді.


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