Я працюю над мовою генеалогії 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
в кожен випадок повинен бути однаковим?
У мене виникають проблеми з пошуком загального рішення цього питання, і я не можу знайти багато літератури з цього приводу. Щоразу, коли я знаходжу щось подібне - мову, засновану на висловленні, на основі обмежень, - вони зупиняються лише від алгебраїчних типів даних та поліморфізму.
Будь-який вклад дуже цінується!