40 votes

Encodage des modules ML standard dans OO

Le ML module de système se présente comme un high-water mark de support de langages de programmation pour l'abstraction de données. Cependant, superficiellement, il semble qu'il peut facilement être codé dans un langage orienté objet qui prend en charge type abstrait membres. Par exemple, nous pouvons coder les éléments de SML module de système Scala comme suit:

  • SML signatures: Scala traits avec aucun des éléments de béton
  • SML structures donné, avec les signatures: Scala objets de l'extension de caractéristiques
  • SML foncteurs paramétrés par les signatures: Scala classes d'objets de l'extension de caractéristiques comme des arguments du constructeur

Existe-il des caractéristiques importantes d'un tel codage manquer? Tout ce qui peut être exprimé dans les LMS de modules de codage ne peut pas exprimer? Aucune garantie que les SML fait que cet encodage ne serait pas en mesure de faire?

51voto

Andreas Rossberg Points 11897

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X