Question

J'ai lu que le système de type de Scala est affaibli par l'interopérabilité Java et ne peut donc pas effectuer certaines des mêmes pouvoirs que le système de type de Haskell. Est-ce vrai? La faiblesse en raison de l'effacement de type, ou je me trompe dans tous les sens? Cette différence est la raison pour laquelle Scala n'a pas classes de types?

Était-ce utile?

La solution

La grande différence est que Scala n'a pas l'inférence de type global Hindley-Milner et utilise plutôt une forme d'inférence de type local, vous demandant de spécifier les types de paramètres de la méthode et le type de retour pour les fonctions surchargées ou récursifs.

Ce n'est pas entraîné par l'effacement de type ou par d'autres exigences de la machine virtuelle Java. Toutes les difficultés possibles peuvent être surmontées ici, et ont été, il suffit de considérer Jaskell - http: //docs.codehaus .org / écran / JASKELL / Home

inférence H-M ne fonctionne pas dans un contexte orienté objet. Plus précisément, lorsque le type polymorphisme est utilisé (par opposition au polymorphisme ad hoc des classes de type). Ceci est crucial pour Interop forte avec d'autres bibliothèques Java, et (dans une moindre mesure) pour obtenir la meilleure optimisation possible de la machine virtuelle Java.

Il est pas vraiment valable à l'autre que ce soit Haskell ou Scala dispose d'un système de type plus fort, juste qu'ils sont différents. Les deux langues repoussent les limites pour la programmation en fonction de type dans des directions différentes, et chaque langue possède des atouts uniques qui sont difficiles à reproduire dans l'autre.

Autres conseils

système de type Scala est différent de Haskell, alors que ses concepts de Scala sont parfois directement inspirés par les forces de Haskell et sa communauté de chercheurs compétents et professionnels.

Bien sûr, en cours d'exécution sur une machine virtuelle non principalement conçu pour la programmation fonctionnelle en premier lieu crée des problèmes de compatibilité avec les langues existantes ciblant cette plate-forme. Parce que la plupart du raisonnement sur les types qui se passe au moment de la compilation, les limitations de Java (comme langue et comme une plate-forme) à l'exécution ne sont rien à se préoccuper (sauf type Erasure, bien exactement ce bogue semble faire l'intégration dans Java écosystème plus transparente).

Pour autant que je sais le seul « compromis » au niveau du système de type Java est une syntaxe spéciale pour gérer les types bruts. Alors que Scala ne permet même pas les types Raw plus, il accepte les fichiers de classe Java plus âgés avec ce bogue. Peut-être vous avez vu le code comme List[_] (ou l'équivalent List[T] forSome { type T } plus). Ceci est une fonctionnalité de compatibilité avec Java, mais est considéré comme un type existentiel interne aussi, et ne fragilise pas le système de type.

système de type Scala pris en charge par , bien que dans un plus bavard que Haskell façon. Je vous suggère de lire cet article, ce qui pourrait créer une impression différente de la force relative du système de type Scala (le tableau de la page 17 sert une belle liste de concepts de système de type très puissant).

Pas nécessairement liée à la puissance du système de type est compilateurs de l'approche Scala et Haskell utiliser pour déduire types, bien qu'il ait un impact sur la façon dont les gens écrivent le code. Avoir un puissant algorithme d'inférence de type peut qu'il vaille la peine d'écrire du code plus abstrait (vous pouvez vous décider si cela est une bonne chose dans tous les cas).

A la fin de la Scala et le système de type Haskell sont entraînés par le désir de fournir à leurs utilisateurs les meilleurs outils pour résoudre leurs problèmes, mais ont pris des chemins différents pour atteindre cet objectif.

un autre point intéressant à considérer est que Scala soutient directement le style classique OO. Ce qui signifie, il y a sous-type relations (par exemple la liste est une sous-Seq). Et cela rend plus difficile l'inférence de type. Ajoutez à cela le fait que vous pouvez mélanger dans les traits de Scala, ce qui signifie qu'un type donné peut avoir plusieurs relations Supertype (ce qui rend encore plus difficile)

Scala n'a pas rang n types , bien qu'il puisse être possible de < a href = "http://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/" rel = "noreferrer"> travail autour de cette limitation dans certains cas.

Je n'ai peu experenice avec Haskell, mais le plus note I chose évidente que différent du système de type Scala de Haskell est l'inférence de type.

Dans Scala, il n'y a pas l'inférence de type global, vous devez explicitement dire le type d'arguments de la fonction.

Par exemple, à Scala vous devez écrire ceci:

def add (x: Int, y: Int) = x + y

au lieu de

add x y = x + y

Cela peut causer des problèmes lorsque vous avez besoin version générique de la fonction ajouter que le travail avec toutes sortes de type a la méthode « + ». Il existe une solution pour cela, mais il obtiendra plus bavard.

Mais en usage réel, j'ai trouvé le système de type Scala est assez puissant pour un usage quotidien, et je l'utilise presque jamais ceux pour contourner le problème peut-être générique, c'est parce que je viens du monde Java.

Et la limitation de déclarer explicitement le type d'arguments n'est pas nécessaire une mauvaise chose, vous avez besoin de documenter toute façon.

Et bien sont-ils réductibles Turing?

Voir la page de Oleg Kiselyov http://okmij.org/ftp/ ... On peut mettre en œuvre le lambda-calcul dans le système de type de Haskell. Si Scala peut le faire, alors dans un sens système de type de Haskell et le système de type Scala calculent les mêmes types. Les questions sont: Comment naturel est l'un sur l'autre? Comment élégant est l'un sur l'autre?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top