63 votes

Quelles sont les différences et les similitudes entre les systèmes de types Scala et Haskell?

Comment expliquer le système de typage de Scala à un expert Haskell? Quels exemples montrent les avantages de Scala?

Comment expliquer le système de typographie de Haskell à un praticien avancé en Scala? Que peut-on faire à Haskell et qui ne peut pas être fait à Scala?

98voto

Apocalisp Points 22526

Scala À un Haskell programmeur:

Scala est une stricte et l'impur de la langue avec les modules de classe. De nouveaux types sont déclarés en tant que modules ("classes"/"traits" avec des différences subtiles). Les Modules peuvent être de type constructeurs de prendre universellement quantifiée des paramètres de type. Les Modules ont des membres constitués de valeurs mutables des variables et des fonctions (appelées "méthodes", à laquelle le module est implicitement passé comme une variable nommée this). Les Modules peuvent avoir les membres de type qui peut aussi prendre des paramètres. Type de membres peut être quantifiée existentiellement et le type des paramètres peut être supérieur kinded.

La première des fonctions de classe sont également des modules. Une fonction est un module avec une méthode nommée apply. Une méthode n'est pas de première classe, mais la syntaxe est fourni pour l'envelopper d'une méthode dans une classe de fonction. Malheureusement, un module exige que tous ses paramètres de type à l'avant, d'où une application partielle de la première classe de la fonction n'est pas autorisé à être universellement quantifiée. Plus généralement, la Scala manque totalement d'un mécanisme direct pour les types de rang supérieur à 1, mais les modules paramétrés sur l'enseignement supérieur-kinded types peuvent être exploitées pour simuler rang n types.

Au lieu de classes de type de portée mondiale, Scala vous permet de déclarer une valeur implicite de tout type. Cela inclut des types de fonction, qui prévoit la conversion implicite, et donc le type d'extension. En plus de conversions implicites, type d'extension est fournie par le "extends" mécanisme qui vous permet de déclarer un sous-type/supertype relation entre les modules. Ce mécanisme peut être utilisé pour simuler des types de données algébriques où le supertype peut être considéré comme le type sur le côté gauche, d'une déclaration de données, et de ses sous-types de la valeur des constructeurs sur le côté droit. Cela signifie également que ADTs ne sont pas vraiment fermé. Scala possède une vaste correspondance de modèle des fonctions d'aide virtualisé modèle de matcher avec la première classe de modèles.

Scala prend en charge le sous-typage, ce qui limite l'inférence de type considérablement. Mais l'inférence de type a amélioré au fil du temps. L'inférence de plus kinded types de prise en charge. Cependant, Scala manque significative, par type de système, et n'a donc pas le type d'inférence et aucun type d'unification. Si une variable de type est introduite, il est de type * moins que annoté autrement. Certains types comme Any (le supertype de tous types) et de l' Nothing (un sous-type de chaque type) sont techniquement de toute nature , bien qu'ils ne peuvent pas être appliquées à des arguments de type.

Haskell à un Scala programmeur:

Haskell est un point de vue purement fonctionnel de la langue. Cela signifie que les fonctions ne sont pas autorisés à avoir des effets secondaires. Par exemple, un programme Haskell ne pas imprimer à l'écran en tant que tel, mais est une fonction qui retourne une valeur de l' IO[_] type de données qui décrit une séquence d'actions pour l'IO sous-système à effectuer.

Alors que Scala est stricte par défaut et fournit un "nom" annotation pour nonstrict les arguments de la fonction, Haskell est paresseux par défaut à l'aide "besoin" de la sémantique, et fournit de l'annotation des arguments.

L'inférence de Type en Haskell est plus complet que dans Scala, avoir plein d'inférence, même partiellement appliquée de type polymorphe des constructeurs. Cela signifie que le type d'annotation est presque jamais nécessaire.

Les récentes extensions du compilateur GHC permettre avancé type de système de caractéristiques qui n'ont pas d'équivalent en Scala, tels que le rang de n types, le type de familles, et polykinds. Un accident de la façon dont les classes de type sont résolus par GHC permet au niveau du type de l'égalité-la vérification des types, qui à son tour permet non ordonnée hétérogène ensembles, quelque chose qui est impossible en Scala.

En Haskell, un module est un ensemble de types et de fonctions, mais les modules ne sont pas des entités de première classe. Implicites sont fournis par les classes de type, mais elles sont globalement portée une fois déclarée, et ils ne peuvent être communiqués explicitement comme dans Scala. Plusieurs instances d'un type donné de classe pour un type donné sont résolus par l' newtype mécanisme alors que dans Scala ce pourrait être résolu simplement par délimitation de l'étendue ou en passant des instances explicitement.

Depuis Haskell n'est pas "orienté objet", il n'y a pas de méthode/fonction dichotomie. Chaque fonction est de première classe et de chaque fonction est préparé par défaut (pas de Fonction1, Fonction2, etc).

6voto

Don Stewart Points 94361

Je ne crois pas que quiconque ait systématiquement comparé Haskell (comme l'illustre le système de type de GHC) à Scalas. Les principaux points de différence sont le degré d'inférence de type et le support pour les types de rang supérieur. Mais un traitement complet des différences serait un résultat publiable.

1voto

Łukasz Lew Points 10907

Mon ami m'envoie ce lien . Les exemples de ce blog sont très intéressants.

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