Entrambi i tipi Unit
e Nothing
indicano una funzione che non restituisce nulla. Qual è la differenza tra loro?Qual è la differenza tra Unità e Niente?
risposta
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à:
Nothing
è un sottotipo di ogni altro tipo (compresiNull
).- 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,.
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ò.
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. Unità CSS - Qual è la differenza tra vh/vw e%?
- 2. Qual è la differenza tra() -> Unità e (Unità) -> Tipi di unità?
- 3. Qual è la differenza tra = e: =
- 4. Qual è la differenza tra Verilog! e ~?
- 5. Qual è la differenza tra? : e ||
- 6. qual è la differenza tra [[], []] e [[]] * 2
- 7. Qual è la differenza tra $ e $$?
- 8. Qual è la differenza tra ("") e (null)
- 9. Qual è la differenza tra dict() e {}?
- 10. Qual è la differenza tra " " e ""?
- 11. Qual è la differenza tra {0} e ""?
- 12. Qual è la differenza tra `##` e `hashCode`?
- 13. Qual è la differenza tra {0} e +?
- 14. Qual è la differenza tra .ToString() e + ""
- 15. qual è la differenza tra:.! e: r !?
- 16. Qual è la differenza tra DbContext e ObjectContext
- 17. Qual è la differenza tra grammatica lessicale e grammatica sintattica?
- 18. Qual è la differenza tra ConditionPathExists = e ConditionPathExists = | in systemd?
- 19. qual è la differenza tra karma e phantomJS
- 20. Qual è la differenza tra DrawableLeft e DrawableStart in EditText?
- 21. Qual è la differenza tra GetLongPathName e GetFullPathName in WinAPI?
- 22. Qual è la differenza tra classi e istanze di oggetti?
- 23. Qual è la differenza tra i termini "file sorgente" e "unità di traduzione"?
- 24. Qual è la differenza tra una Seam e una Mock?
- 25. Qual è la differenza tra "è Nessuno" e "== Nessuno"
- 26. Unix: Qual è la differenza tra la fonte e l'esportazione?
- 27. Qual è la differenza tra il callback e la promessa
- 28. Qual è la differenza tra la sezione .got e .got.plt?
- 29. Qual è la differenza tra la lista() e []
- 30. Qual è la differenza tra GHC e la piattaforma Haskell?
@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