Quelle est la différence entre Unit et Nothing?

Les deux types Unit et Nothing indiquent une fonction qui ne renvoie rien. Quelle est la différence entre eux?

Unit est un type qui a exactement une valeur – voir Type d’unité . D’autre part, Nothing n’a pas de valeur possible – voir Type de fond .

Une fonction qui ne retourne rien doit avoir le type de retour Unit . Si c’était Nothing alors la fonction ne pouvait pas retourner un résultat. La seule façon de quitter la fonction serait une exception.


Nothing n’est utilisé différemment. Il se caractérise par deux propriétés:

  1. Nothing n’est un sous-type de tous les autres types (y compris Null ).
  2. Il n’existe aucune instance de ce type.

Quand est-ce utile? Considérer None :

 object None extends Option[Nothing] 

Puisque Option est covariant dans son paramètre type et que Nothing est un sous-type de tout, Option[Nothing] est un sous-type de l’ Option[A] pour chaque type A Ainsi, nous pouvons faire un object None qui est un sous-type de l’ Option[A] pour chaque A C’est raisonnable, car Nothing ne peut être instancié, alors Option[Nothing] sera toujours sans valeur. De même

 object Nil extends List[Nothing] 

Unit correspond à true logique et Nothing correspond à false false sous l’ isomorphisme Curry-Howard , où nous considérons les types comme des propositions et des fonctions comme preuves.

Unit signifie que (a) la fonction a des effets secondaires tels que l’entrée et la sortie, (b) ces effets secondaires sont l’objective principal de la fonction. Bien sûr, la fonction peut avoir des effets secondaires même si son type est différent de celui de l’ Unit .

Nothing n’est un type spécial dans Scala, car (a) il n’a pas de valeur (Unit a une seule valeur – () ), donc vous ne pouvez pas renvoyer la valeur de type Nothing et (b) c’est un sous-type de tous les autres types. Cela signifie que si quelque chose a tapé Nothing , elle peut être utilisée partout où un autre type est requirejs, mais cela ne produira aucun résultat. Ceci est utilisé pour traiter les exceptions – l’expression de throw a un type de Nothing , elle peut donc être utilisée pratiquement partout dans un programme.

Simplement, Nothing signifie qu’il y a eu une erreur et que rien n’a été renvoyé, alors que Unit signifie qu’il y avait des effets secondaires.

La programmation à Scala a une bonne explication à cela.

Pour append un aspect à la réponse de Petr: Nothing joue un rôle important dans la hiérarchie des types. C’est un type de fond. Cela signifie que c’est un sous-type de tout autre type, qui est comme l’opposé de Any , qui est un supertype de tout. Vous pouvez trouver une belle explication ici .