Sto lavorando su un linguaggio basato sull'espressione della genealogia ML, quindi ha naturalmente bisogno dell'inferenza del tipo> :)
Ora sto cercando di estendere una soluzione basata sui vincoli al problema di inferire i tipi, basata su una semplice implementazione in EOPL (Friedman e Wand), ma questi si adattano elegantemente a tipi di dati algebrici.
Quello che ho finora funziona senza intoppi; se un'espressione e
è a + b
, e : Int
, a : Int
e b : Int
. Se e
è una partita,
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Posso giustamente dedurre che il t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
e così via ...
Ma non sono molto sicuro quando si tratta di tipi di dati algebrici. Supponiamo che una funzione come il filtro:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Affinché il tipo di elenco rimanga polimorfico, i Contro devono essere di tipo a * a list -> a list
. Quindi, nello stabilire questi vincoli, ho ovviamente bisogno di cercare questi tipi dei miei costruttori algebrici - il problema che ho ora è la "sensibilità al contesto" di molteplici usi dei costruttori algebrici - come posso esprimere nelle mie equazioni dei vincoli che a
in ogni caso deve essere lo stesso?
Ho difficoltà a trovare una soluzione generale a questo, e non riesco a trovare molta letteratura su questo. Ogni volta che trovo qualcosa di simile - un linguaggio basato sull'espressione con un'inferenza di tipo basata sui vincoli - si fermano appena al di sotto dei tipi di dati algebrici e del polimorfismo.
Ogni input è molto apprezzato!