Я работаю над языком выражения, основанным на генеалогии ML, поэтому, естественно, требуется вывод типа> :)
Теперь я пытаюсь расширить решение на основе ограничений для определения типов, основанное на простой реализации в EOPL (Фридман и Ванд), но они элегантно обходят алгебраические типы данных.
То, что у меня есть, работает плавно; если выражение 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
Чтобы тип списка оставался полиморфным, необходимо, чтобы тип Cons был типом a * a list -> a list
. Итак, при установлении этих ограничений, мне, очевидно, нужно искать эти типы моих алгебраических конструкторов - проблема, которую я сейчас имею, - это «контекстно-зависимая» многократного использования алгебраических конструкторов - как я могу выразить в своих уравнениях ограничений, что a
в каждый случай должен быть одинаковым?
У меня проблемы с поиском общего решения, и я не могу найти много литературы по этому вопросу. Всякий раз, когда я нахожу что-то похожее - язык, основанный на выражениях, с логическим выводом на основе ограничений - они не дотягивают до алгебраических типов данных и полиморфизма.
Любой вклад очень ценится!