Inferencia de tipo basada en restricciones con datos algebraicos

11

Estoy trabajando en un lenguaje basado en expresiones de genealogía ML, por lo que naturalmente necesita inferencia de tipos> :)

Ahora, estoy tratando de extender una solución basada en restricciones al problema de inferir tipos, basada en una implementación simple en EOPL (Friedman y Wand), pero ellos eligen elegantemente los tipos de datos algebraicos.

Lo que tengo hasta ahora funciona sin problemas; si una expresión ees a + b, e : Int, a : Inty b : Int. Si ees un partido,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

Puedo inferir con razón, que el t(e) = t(the whole match expression), t(n) = t(0) = t(n'), t(match) = t(1) = t(n' * fac(n - 1)y así sucesivamente ...

Pero no estoy muy seguro cuando se trata de tipos de datos algebraicos. Supongamos una función como filtro:

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

Para que el tipo de lista siga siendo polimórfico, Cons debe ser de tipo a * a list -> a list. Así, en el establecimiento de estas limitaciones, que obviamente tendrá que buscar estos tipos de mis constructores algebraicas - el problema que ahora tengo es la 'sensibilidad al contexto' de múltiples usos de constructores algebraicas - ¿Cómo expreso en mis ecuaciones de restricción que la ade cada caso debe ser igual?

Tengo problemas para encontrar una solución general a esto, y no puedo encontrar mucha literatura sobre esto. Cada vez que encuentro algo similar, un lenguaje basado en expresiones con inferencia de tipos basada en restricciones, se detienen poco menos que los tipos de datos algebraicos y el polimorfismo.

¡Cualquier aporte se agradecerá!

Kris
fuente
@Guy No quiero parecer desagradecido, pero no estoy buscando una solución estándar, ¿tiene alguna sugerencia? La mayoría de los documentos existentes que pude encontrar (como los documentos de INRIA sobre ML, OCaml ...) son mucho más extensos de lo que necesito (y soy capaz de entender).
Kris
Comenzaría con el capítulo de inferencia en ATTAPL , creo que discuten todo lo que necesita a un nivel accesible.
Gilles 'SO- deja de ser malvado'
@Gilles Creo que ATTAPL es el único libro PL 'clásico' que no tengo en mi estantería: P Pero gracias, lo echaré un vistazo el lunes, me siento en el piso de Uni con quizás 10 copias distribuidas en las oficinas: )
Kris
@Kris, ¿alguna vez encontró un recurso accesible que aborde este problema? Mi implementación de un "mini ML" está atascado exactamente en este problema ... Creo que encontré el capítulo relevante de ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) y hojeé la sección sobre algebraico tipos de datos, pero me temo que está un poco sobre mi cabeza.
michiakig
@spacemanaki Sí, desde entonces he encontrado que pdfs.semanticscholar.org/8983/… es un excelente recurso para esto exactamente.
Kris

Respuestas:

2

Ver: Mini ML Específicamente la sección Inferencia de tipo.

Contiene código de muestra en F # para un analizador completo de un lenguaje funcional simple. Más importante aún, la sección de inferencia de tipo implementa el algoritmo Hindley-Milner, que es lo que se encuentra en la mayoría del sistema de inferencia de tipo. El autor también proporciona enlaces a otros dos documentos importantes para ayudar a comprender Hindley-Milner; uno es una especie de introducción de alto nivel y el otro es un documento que describe la implementación del algoritmo en código.

Guy Coder
fuente
Los enlaces individuales generalmente no son una respuesta. Explique qué se puede encontrar allí y por qué ayuda.
Raphael