La lecture des Inconvénients de la Scala type de système et Haskell?, Je dois poser la question: qu'est-ce, précisément, qui fait Haskell type de système plus puissant que les autres langues " systèmes de type (C, C++, Java). Apparemment, même Scala ne pouvez pas effectuer certaines des mêmes pouvoirs que Haskell type de système. Qu'est-ce, précisément, qui fait Haskell type de système (Hindley–Milner, l'inférence de type) si puissante? Pouvez-vous donner un exemple?
Réponses
Trop de publicités?Qu'est-ce, précisément, qui fait Haskell type de système
Il a été conçu pour les dix dernières années pour être à la fois souple, comme une logique de propriété de vérification -- et puissant.
Haskell type de système a été développé au fil des ans, afin d'encourager une relativement souple, expressif de la vérification statique de la discipline, avec plusieurs groupes de chercheurs d'identifier le type de système de techniques qui permettent de puissantes nouvelles classes de la compilation de vérification. Scala est relativement peu développé dans la région.
C'est, Haskell/GHC fournit une logique qui est à la fois puissant et conçu pour encourager type de niveau de la programmation. Quelque chose d'assez unique dans le monde de la programmation fonctionnelle.
Certains documents qui donnent une idée de la direction de l'ingénierie de l'effort sur Haskell type de système a pris:
Hindley-Milner n'est pas un système de type, mais un algorithme d'inférence de types. Haskell type de système, de retour dans la journée, utilisé pour être en mesure d'être entièrement déduit à l'aide HM, mais que le navire a longtemps navigué moderne Haskell avec des extensions. (ML reste capable d'être entièrement déduite).
Sans doute, la capacité de principalement ou entièrement en déduire tous les types des rendements de puissance en termes d'expressivité.
Mais c'est largement pas ce que je pense que la question est vraiment.
Les documents que les dons liés point à l'autre aspect, - que les extensions de Haskell type de système de turing (et que de type moderne les familles à faire que de turing complet de la langue beaucoup plus proches de la valeur au niveau de la programmation). Un autre bel article sur ce sujet est McBride de faire Semblant: Simulation des Types de charge en Haskell.
Le papier dans l'autre thread sur Scala: "les Classes de Type en tant qu'Objets et Implicites" va dans pourquoi vous pouvez en fait faire plus de cela à la Scala, bien qu'avec un peu plus de clarté. J'ai tendance à penser, mais ce n'est plus un intestin de sens que de réel Scala expérience, que son plus ad-hoc et explicite approche (ce que le C++ de discussion appelé "nominal") est finalement un peu messier.
Allons-y avec un exemple très simple: Haskell Maybe
.
data Maybe a = Nothing | Just a
En C++:
template <T>
struct Maybe {
bool isJust;
T value; // IMPORTANT: must ignore when !isJust
};
Considérons ces deux signatures de fonction, en Haskell:
sumJusts :: Num a => [Maybe a] -> a
et C++:
template <T> T sumJusts(vector<maybe<T> >);
Différences:
- En C++ il y a plus d'erreurs possibles à faire. Le compilateur ne vérifie pas la règle d'utilisation de l'
Maybe
. - Le C++ type d'
sumJusts
ne précise pas qu'il exige+
et moulé en0
. Les messages d'erreur qui s'affiche quand les choses ne fonctionnent pas sont cryptiques et de l'impair. En Haskell, le compilateur va simplement se plaindre que le type n'est pas une instance d'Num
, très simple..
En bref, Haskell a:
- ADTs
- Type-classes
- Un très sympathique syntaxe et un bon soutien pour les génériques (qui en C++ les gens essaient d'éviter à cause de toutes leurs cryptickynessishisms)
Haskell langage permet d'écrire du code plus sûr, sans renoncer avec des fonctionnalités. La plupart des langues de nos jours le commerce caractéristiques pour la sécurité: le langage Haskell est là pour montrer que c'est possible d'avoir les deux.
Nous pouvons vivre sans les pointeurs null, explicite, de pièces coulées, de dactylographie et toujours parfaitement le langage expressif, capable de produire de l'efficacité du code final.
De plus, le Haskell type de système, avec ses paresseux par défaut et la pureté de l'approche de codage vous donne un coup de pouce à compliquer mais des questions importantes, telles que le parallélisme et de la concurrence.
Juste mes deux cents.
Une des choses que j’aime vraiment beaucoup dans d’autres langues et que je manque vraiment, c’est le support des classes de types, qui constituent une solution élégante à de nombreux problèmes (y compris par exemple les fonctions polyvariadiques).
En utilisant des classes de types, il est extrêmement facile de définir des fonctions très abstraites, qui restent totalement sécurisées au type - comme par exemple cette fonction Fibonacci:
fibs :: Num a => [a]
fibs@(_:xs) = 0:1:zipWith (+) fibs xs
Par exemple:
map (`div` 2) fibs -- integral context
(fibs !! 10) + 1.234 -- rational context
map (:+ 1.0) fibs -- Complex context
Vous pouvez même définir votre propre type numérique pour cela.