2012-11-24 5 views

Antwort

52

Unit ist ein Typ, der genau einen Wert hat - siehe Unit type. Auf der anderen Seite Nothing hat nicht möglich Wert - siehe Bottom type.

Eine Funktion, die nichts zurückgibt, muss den Rückgabetyp Unit haben. Wenn es Nothing wäre, könnte die Funktion kein Ergebnis zurückgeben. Die einzige Möglichkeit, die Funktion zu verlassen, wäre eine Ausnahme.


Nothing wird auf eine andere Weise verwendet. Er wird durch zwei Eigenschaften aus:

  1. Nothing ein Subtyp von jedem anderen Typ (einschließlich Null).
  2. Es gibt keine Instanzen dieses Typs.

Wann ist das nützlich? Betrachten None:

object None extends Option[Nothing] 

Da Option in seiner Art Parametern covariant und Nothing ist ein Subtyp von allem, Option[Nothing] ist ein Subtyp von Option[A] für jede Art A. Also können wir ein Objekt None machen, das ein Subtyp von Option[A] für jeden A ist. Dies ist sinnvoll, da Nothing nicht instanziiert werden kann, so dass Option[Nothing] immer ohne Wert ist. Ähnlich

object Nil extends List[Nothing] 

Unit entspricht logisch wahr und Nothing entspricht logisch falsch unter dem Curry-Howard isomorphism, wo wir Typen wie Sätze und Funktionen als Beweise sehen.

13

Unit bedeutet, dass (a) Funktion hat Nebenwirkungen wie Eingang und Ausgang, (b) diese Nebenwirkungen sind das Hauptziel der Funktion. Natürlich kann die Funktion Nebenwirkungen haben, auch wenn der Typ sich von Unit unterscheidet.

Nothing ist ein spezieller Typ in Scala, weil (a) es keine Werte hat (Einheit hat exectly einen Wert - ()), so dass Sie nicht Wert vom Typ zurückgeben Nothing und (b) es ist ein Subtyp von allen anderen Typen ist . Das heißt, wenn etwas vom Typ Nothing ist, kann es überall dort verwendet werden, wo ein anderer Typ benötigt wird, aber es wird kein Ergebnis liefern. Dies wird für den Umgang mit Ausnahmen verwendet - throw Ausdruck hat eine Art von Nothing, so dass es grundsätzlich überall in einem Programm verwendet werden kann.

Einfach, Nothing bedeutet, dass es einen Fehler gab und nichts zurückgegeben wurde, während Unit bedeutet, dass es Nebenwirkungen gab.

Programming in Scala hat eine schöne Erklärung davon.

6

Um einen Aspekt zu Petrs Antwort hinzuzufügen: Nothing spielt eine wichtige Rolle in der Typhierarchie. Es ist ein Bottom-Typ. Das bedeutet, dass es ein Subtyp von jedem anderen Typ ist, der wie das Gegenteil von Any ist, was ein Supertyp von allem ist. Sie können eine schöne Erklärung here finden.

+1

@ downvoters: Als ich diese Antwort schrieb, erwähnte Petr in der Antwort überhaupt nicht den unteren Typaspekt. Er fügte es erst später hinzu. – bluenote10

Verwandte Themen