Il y a quelques différences fondamentales que vous ne pouvez pas surmonter facilement:
ML signatures sont des types de construction, Scala traits sont nominales: un ML de signature peut être égalé par aucun module approprié après le fait, pour Scala objets que vous devez déclarer la relation à la définition du temps. De même, le sous-typage entre ML de signatures est entièrement structurels. Scala améliorations sont plus proches des types de construction, mais plutôt des limites sévères (par exemple, ils ne peuvent pas faire référence à leurs propres définitions de type, ni contenir des gratuit des références à des types abstraits en dehors de leur champ d'application).
ML signatures peuvent être composés structurellement à l'aide de include
et where
. La résultante de signature est équivalente à la ligne d'extension de chaque expression la signature de la ou du type de l'équation. Scala, à la composition mixin, tandis que le plus puissant dans de nombreuses façons, une fois encore, nominal, et crée un inequivalent type. Même l'ordre de composition des questions pour le type d'équivalence.
ML foncteurs sont paramétrées par des structures, et donc par les deux types et des valeurs, de la Scala de classes génériques ne sont paramétrés par types. Pour encoder un foncteur, vous auriez besoin d'en faire un générique de la fonction, qui prend les types et les valeurs séparément. En général, cette transformation, qu'on appelle la phase de fractionnement dans la ML du module de la littérature, ne peut être limitée à quelques définitions et usages de foncteurs, parce que, à leur appel-sites, il doit être appliqué de manière récursive pour la structure imbriquée des arguments; finalement, cela exige que toutes les structures sont toujours en phase de split, qui n'est pas un style que vous voulez programmer manuellement. (Ni est-il possible de mapper des foncteurs à la plaine de fonctions en Scala, car les fonctions ne peuvent pas exprimer le type de dépendances entre paramètre et les types de résultats. Edit: depuis la version 2.10, Scala a une prise en charge de la dépendance des méthodes, qui peut encoder quelques exemples de SML de premier ordre générative foncteurs, bien qu'il ne semble pas possible dans le cas général.)
ML a une théorie générale de raffinage et de la propagation de "translucide" type d'informations. Scala utilise un affaiblissement général paramétré par la théorie de "path-dependent" types, où les chemins désignent des objets. Scala ainsi métiers ML est plus de type expressif équivalences pour la possibilité d'utiliser des objets (avec des membres du type) comme des valeurs de première classe. Vous ne pouvez pas facilement avoir les deux sans rapidement en cours d'exécution dans decidability ou de la solidité.
Edit: ML peut naturellement exprimer type abstrait constructeurs (c'est à dire, les types de genre plus élevé), qui surviennent souvent avec des foncteurs. Pour Scala, à la hausse des types doivent être activées de manière explicite, qui sont de plus en plus difficile pour son type de système, et la conduira à indécidable vérification de type.
Les différences deviennent encore plus intéressants quand vous vous déplacez au-delà de LMS, d'ordre supérieur, de première classe, ou récursive modules. Nous discutons brièvement à quelques questions dans la Section 10.1 de notre MixML papier.