2012-11-24 7 views

risposta

52

Unit è un tipo che ha esattamente un valore - vedere Unit type. D'altra parte, Nothing ha nessun valore possibile - vedere Bottom type.

Una funzione che non restituisce nulla deve avere il tipo di ritorno Unit. Se fosse Nothing, la funzione non potrebbe restituire un risultato. L'unico modo per uscire dalla funzione sarebbe un'eccezione.


Nothing viene utilizzato in un modo diverso. Essa è caratterizzata da due proprietà:

  1. Nothing è un sottotipo di ogni altro tipo (compresi Null).
  2. Non esistono casi di questo tipo.

Quando è utile? Considerate None:

object None extends Option[Nothing] 

Perché Option è covariante nel suo parametro di tipo e Nothing è un sottotipo di tutto, Option[Nothing] è un sottotipo di Option[A] per ogni tipo A. Quindi, possiamo creare un oggetto None che è un sottotipo di Option[A] per ogni A. Questo è ragionevole, dal momento che Nothing non può essere istanziato, quindi Option[Nothing] sarà sempre senza valore. Analogamente

object Nil extends List[Nothing] 

Unit corrisponde true logico e Nothing corrisponde a false logico sotto il Curry-Howard isomorphism, dove consideriamo tipi come proposizioni e funzioni prove,.

13

Unit significa che (a) la funzione ha effetti collaterali come input e output, (b) questi effetti collaterali sono l'obiettivo principale della funzione. Naturalmente, la funzione può avere effetti collaterali anche se il suo tipo è diverso da Unit.

Nothing è un tipo speciale di Scala, perché (a) non ha valori (Unità ha exectly un valore - ()), quindi non si può valore di tipo Nothing tornare e (b) è un sottotipo di ogni altro tipo . Ciò significa che se qualcosa ha tipo Nothing, può essere utilizzato in ogni luogo in cui è richiesto un altro tipo, ma non produrrà alcun risultato. Questo è usato per gestire le eccezioni - l'espressione throw ha un tipo di Nothing, quindi può essere usata praticamente ovunque in un programma.

Semplice, Nothing significa che si è verificato un errore e non è stato restituito nulla, mentre Unit significa che si sono verificati effetti collaterali.

Programming in Scala ha una bella spiegazione di ciò.

6

Per aggiungere un aspetto alla risposta di Petr: Nothing svolge un ruolo importante nella gerarchia dei tipi. È un tipo di fondo. Ciò significa che si tratta di un sottotipo di ogni altro tipo, che è come l'opposto di Any, che è un supertipo di tutto. Puoi trovare una bella spiegazione here.

+1

@downvoters: quando ho scritto questa risposta, la risposta di Petr non ha menzionato affatto l'aspetto di tipo inferiore. L'ha aggiunto solo più tardi. – bluenote10

Problemi correlati