Quelle est la différence entre la valeur undefined dans Haskell et null en Java?
Ok, nous allons revenir un peu.
"undefined" en Haskell est un exemple d'un "fond" de la valeur (notée ⊥). Cette valeur représente l'indéfini, coincé ou partielle de l'etat dans le programme.
De nombreuses formes différentes de fond existent: la non-terminaison des boucles, des exceptions, en correspondance du modèle échecs -- pratiquement n'importe quel état dans le programme qui n'est pas définie dans un certain sens. La valeur undefined :: a
est un exemple canonique d'une valeur qui met le programme dans un état indéfini.
undefined
lui-même n'est pas particulièrement spécial -- ses pas câblé, et vous pouvez mettre en œuvre Haskell undefined
à l'aide de tout le bas-rendement de l'expression. E. g. c'est un valide la mise en œuvre de l' undefined
:
> undefined = undefined
Ou quitter immédiatement (la vieille bonne à tout faire compilateur utilisé cette définition):
> undefined | False = undefined
La propriété principale de fond est que si une expression est évaluée à fond, l'ensemble de votre programme permettra d'évaluer à fond: le programme est dans un état indéfini.
Pourquoi voudriez-vous une telle valeur? Eh bien, dans un paresseux de la langue, vous pouvez souvent manipuler des structures ou des fonctions que le magasin de fond des valeurs, sans que le programme lui-même en bas.
E. g. une liste de boucle infinie est parfaitement cromulent:
> let xs = [ let f = f in f
, let g n = g (n+1) in g 0
]
> :t xs
xs :: [t]
> length xs
2
Je ne peux pas faire grand chose avec les éléments de la liste:
> head xs
^CInterrupted.
Cette manipulation de l'infini des choses est en partie pourquoi Haskell est tellement amusant et expressive. À la suite de la paresse est Haskell accorde une attention toute particulière à l' bottom
valeurs.
Cependant, clairement, le concept de fond s'applique aussi bien à la Java, ou tout (non totale) de la langue. En Java, il existe de nombreuses expressions qui donnent "bas" valeurs:
- la comparaison d'une référence null (si pas d'
null
lui-même, qui est bien défini);
- la division par zéro;
- hors-limites des exceptions;
- une boucle infinie, etc.
Vous n'avez tout simplement pas la capacité de remplacer un fond pour une autre très facilement, et le compilateur Java ne fait pas beaucoup de raison, sur fond de valeurs. Toutefois, ces valeurs sont là.
En résumé,
- référence à un
null
de la valeur en Java est une expression qui produit une valeur inférieure en Java;
- l'
undefined
de la valeur en Haskell est un générique de bas rendement expression qui peut être utilisé partout où une valeur inférieure est nécessaire en Haskell.
C'est la façon dont ils sont similaires.
Postscript
Quant à la question de l' null
lui-même: pourquoi il est considéré comme une mauvaise forme?
- Tout d'abord, Java
null
est essentiellement équivalent à l'ajout d'un implicite Maybe a
pour chaque type a
en Haskell.
- Un déréférencement
null
est équivalent à la correspondance de modèle que pour l' Just
cas: f (Just a) = ... a ...
Ainsi, lorsque la valeur transmise est - Nothing
(en Haskell), ou null
(en Java), votre programme atteint un état indéfini. Ce qui est mauvais: votre programme est en panne.
Donc, en ajoutant null
pour chaque type, vous avez tout à fait, il est beaucoup plus facile de créer bottom
valeurs par accident -- les types plus vous aider. Votre langue n'est plus vous aider à éviter ce genre d'erreur, et que c'est mal.
Bien sûr, les autres valeurs sont toujours là: les exceptions (comme undefined
) , ou les boucles infinies. Ajout possible d'un mode de défaillance pour chaque fonction -- déréférencement null
-- tout simplement qu'il est plus facile d'écrire des programmes qui plantent.