Inferenza del tipo basata su vincoli con dati algebrici


11

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 : Inte 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 ain 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!


@Guy Non intendo sembrare ingrato, ma non sto cercando una soluzione standard - hai qualche suggerimento? La maggior parte dei documenti esistenti che ho potuto trovare (come i documenti INRIA su ML, OCaml ...) sono molto più estesi di ciò di cui ho bisogno (e sono in grado di capire).
Kris,

Comincerei con il capitolo dell'inferenza in ATTAPL , penso che discutano di tutto ciò di cui hai bisogno a un livello accessibile.
Gilles 'SO- smetti di essere malvagio' il

@Gilles Penso che ATTAPL sia l'unico libro "classico" di PL che non ho sulla mia libreria: P Ma grazie, darò un'occhiata lunedì, mi siedo su un piano di Uni con forse 10 copie distribuite negli uffici: )
Kris

@Kris hai mai trovato una risorsa accessibile per affrontare questo problema? La mia implementazione di un "mini ML" è bloccata proprio su questo problema ... Penso di aver trovato il capitolo pertinente di ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) e ho sfogliato la sezione su algebrica tipi di dati, ma temo che sia un po 'fuori di testa.
michiakig,

@spacemanaki Sì, da allora ho trovato pdfs.semanticscholar.org/8983/… una risorsa eccellente proprio per questo.
Kris,

Risposte:


2

Vedi: Mini ML In particolare la sezione Inferenza del tipo.

Questo contiene un codice di esempio in F # per un parser completo di un linguaggio funzionale semplice. Ancora più importante, la sezione Inferenza del tipo implementa l'algoritmo Hindley-Milner che è quello che si trova nella maggior parte del sistema di inferenza del tipo. L'autore fornisce anche collegamenti ad altri due importanti documenti per aiutare a comprendere Hindley-Milner; uno è una specie di introduzione di alto livello e l'altro è un documento che descrive l'implementazione dell'algoritmo nel codice.


I collegamenti singoli non sono generalmente una risposta. Si prega di elaborare ciò che può essere trovato lì e perché aiuta.
Raffaello
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.