Je réalise que certaines choses sont plus faciles / plus difficiles dans une langue que dans l'autre, mais je ne m'intéresse qu'aux fonctionnalités liées au type qui sont possibles dans l'une et impossibles / non pertinentes dans l'autre. Pour le rendre plus spécifique, ignorons les extensions de type Haskell car il y en a tellement qui font toutes sortes de choses folles / cools.
java
haskell
type-systems
static-typing
GlenPeterson
la source
la source
Réponses:
("Java", tel qu'utilisé ici, est défini en tant que norme Java SE 7 ; "Haskell", tel qu'utilisé ici, est défini en tant que norme Haskell 2010. )
Ce que le système de types de Java a mais que Haskell n'a pas:
Choses que le système de types de Haskell a mais que celles de Java ne:
MODIFIER:
Exemples de chacun des points énumérés ci-dessus:
Unique à Java (par rapport à Haskell)
Polymorphisme nominal de sous-type
Informations de type d'exécution partielle
Unique à Haskell (par rapport à Java)
Polymorphisme ad hoc limité
Polymorphisme de sous-type "basé sur des contraintes" (basé sur un polymorphisme ad-hoc lié)
Polymorphisme paramétrique de type élevé
Dactylographie principale
Il est difficile de donner un exemple direct avec celui-ci, mais cela signifie que chaque expression a exactement un type général maximum (appelé son type principal ), qui est considéré comme le type canonique de cette expression. En termes de polymorphisme de sous-type "basé sur la contrainte" (voir ci-dessus), le type principal d'une expression est le sous-type unique de chaque type possible dans lequel cette expression peut être utilisée. La présence d'un typage principal dans Haskell (non étendu) est ce qui permet une inférence de type complète (c'est-à-dire une inférence de type réussie pour chaque expression, sans aucune annotation de type nécessaire). Les extensions qui rompent le typage principal (il en existe beaucoup) cassent également la complétude de l'inférence de type.
la source
l
comme une seule lettre variable, il est TRÈS difficile de distinguer1
!Typeable
, mais Haskell 2010 ne l'a pas (peut-être que Haskell 2014 l'aura?).Le système de types de Java manque de polymorphisme plus élevé. Le système de types de Haskell l'a.
En d'autres termes: en Java, les constructeurs de types peuvent abstraire sur les types, mais pas sur les constructeurs de types, alors qu'en Haskell, les constructeurs de types peuvent abstraire sur les constructeurs de types ainsi que sur les types.
En anglais: en Java, un générique ne peut pas prendre un autre type générique et le paramétrer,
alors que dans Haskell c'est assez facile
la source
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. L'idée ici serait que si quelqu'un l'appelait commeconvertStringsToInts<ArrayList>
cela prendrait un arrayliste de chaînes et renverrait un arrayliste d'entiers. Et s'ils utilisaient à la placeconvertStringsToInts<LinkedList>
, ce serait la même chose avec les listes chaînées.forall
dans vos types. En Haskell, un typea -> b
est implicitementforall a. forall b. a -> b
. Avec une extension, vous pouvezforall
les expliciter et les déplacer.Pour compléter les autres réponses, le système de types de Haskell ne comporte pas de sous - typage , contrairement aux langages orientés objet typés, comme le fait Java.
la source
L'inférence de type est une chose que personne n'a encore mentionnée: un compilateur Haskell peut généralement déduire le type d'expressions, mais vous devez indiquer vos types au compilateur Java en détail. Strictement, il s’agit d’une caractéristique du compilateur, mais la conception du langage et du système de types détermine si l’inférence de type est réalisable. En particulier, l'inférence de type interagit mal avec le polymorphisme de sous-type et la surcharge ad hoc de Java. En revanche, les concepteurs de Haskell s'efforcent de ne pas introduire de fonctionnalités ayant un impact sur l'inférence de type.
Une autre chose que les gens ne semblent pas avoir mentionnée jusqu’à présent concerne les types de données algébriques. C'est-à-dire la capacité de construire des types à partir de sommes ('ou') et de produits ('et') d'autres types. Les classes Java font des produits (champ a et champ b, disons) bien. Mais ils ne font pas vraiment de sommes (champ a OU ou champ b, disons). Scala doit l'encoder sous forme de plusieurs classes de cas, ce qui n'est pas tout à fait la même chose. Et bien que cela fonctionne pour Scala, il est un peu exagéré de dire que Java l’a.
Haskell peut également construire des types de fonction en utilisant le constructeur de fonction, ->. Bien que les méthodes de Java aient des signatures de type, vous ne pouvez pas les combiner.
Le système de types de Java permet un type de modularité que Haskell n'a pas. Il faudra un certain temps avant qu’il n’y ait un OSGi pour Haskell.
la source