Pracuję nad językiem genealogicznym ML opartym na wyrażeniach, więc oczywiście wymaga wnioskowania typu> :)
Teraz próbuję rozszerzyć oparte na ograniczeniach rozwiązanie problemu wnioskowania typów, oparte na prostej implementacji w EOPL (Friedman i Wand), ale są to eleganckie algebraiczne typy danych.
To, co mam do tej pory, działa płynnie; Jeśli wyrażenie e
jest a + b
, e : Int
, a : Int
i b : Int
. Jeśli e
pasuje
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Mogę słusznie wywnioskować, że t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
i tak dalej ...
Ale jestem bardzo niepewny, jeśli chodzi o algebraiczne typy danych. Załóżmy, że funkcja taka jak filtr:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Aby typ listy pozostał polimorficzny, Cons musi być typu a * a list -> a list
. Tak więc, przy ustalaniu tych ograniczeń, to oczywiście trzeba zajrzeć do tych typów moich algebraicznych konstruktorów - problem mam teraz jest „kontekst czułości” wielu zastosowań algebraicznych konstruktorów - jak mogę wyrazić w moim równań więzów, że a
w każda sprawa musi być taka sama?
Mam problem ze znalezieniem ogólnego rozwiązania tego problemu i nie jestem w stanie znaleźć na ten temat dużej literatury. Ilekroć znajdę coś podobnego - język oparty na wyrażeniach z wnioskowaniem typu na podstawie ograniczeń - przestają mieć tylko algebraiczne typy danych i polimorfizm.
Wszelkie uwagi są mile widziane!