¿Cuál es la diferencia(si existe) entre el sistema de módulos de ML estándar y el sistema de módulos OCaml?
sml (2)
En cuanto a la semántica, una respuesta mucho mejor y más elaborada es dada por Andreas Rossberg arriba. Sin embargo, con respecto a la sintaxis, este sitio podría ser lo que estás buscando.
Mi pregunta es si existe alguna diferencia entre el sistema de módulos de ML estándar y el sistema de módulos OCaml. Tiene OCaml todo el apoyo de functors, adscriptions, etc. que tiene SML?
Hay algunas diferencias entre las características, así como semánticamente.
Características SML soporta pero no OCaml:
- Asignación de firma transparente
- nivel de módulo
let
- restricciones simétricas de uso compartido
- azúcar sintáctico para funtores sobre tipos y valores
Características OCaml 4 tiene pero no SML:
- functors de orden superior
- módulos recursivos
- módulos locales
- firmas anidadas
- módulos como valores de primera clase
- compartición general de módulos (
sig with module A = M
) -
module type of
Sin embargo, varias implementaciones de SML proporcionan algunas de ellas como extensiones: por ejemplo, funtores de orden superior (SML / NJ, Moscow ML, Alice ML), módulos locales y de primera clase (Moscow ML, Alice ML), módulos compartidos (SML / NJ, Alice ML), firmas anidadas (Moscow ML, Alice ML) y módulos recursivos (Moscow ML).
En cuanto a la semántica, la mayor diferencia está en el tratamiento de la equivalencia de tipo, especialmente con respecto a los funtores:
En SML, los funtores son generativos , lo que significa que aplicar el mismo funtor dos veces al mismo argumento siempre produce tipos nuevos.
Editar : OCaml 4 agregó la capacidad de hacer generadores de funcionamientos de forma opcional.
En OCaml, los funtores son aplicativos , lo que significa que al aplicar el mismo funtor dos veces al mismo argumento (más restricciones sintácticas adicionales) se reproducen tipos equivalentes. Esta semántica es más flexible, pero también puede romper la abstracción (véanse, por ejemplo, los ejemplos que damos en este documento , Sección 8).
OCaml tiene una noción puramente sintáctica de firmas, lo que significa que ciertas equivalencias de tipo no pueden ser expresadas por el sistema de tipo, y se eliminan o se rompen silenciosamente (véase, por ejemplo, este error como un ejemplo sorprendente).
Editar : OCaml 4.02 agregó una semántica especial para "alias de módulos", que solucionan el ejemplo específico en el error al que se hace referencia, pero la limitación general de las firmas sintácticas persiste.
Otra diferencia notable es que el sistema de tipo de módulo de OCaml es indecidible (es decir, la verificación de tipo no puede finalizar), debido a su permiso de firmas abstractas, que SML no permite.