La risposta di Karl è buona. Ecco un altro uso che non penso sia stato menzionato da nessun altro. Il tipo di
if E then A else B
dovrebbe essere un tipo che include tutti i valori nel tipo di A
e tutti i valori nel tipo di B
. Se il tipo di B
è Nothing
, il tipo dell'espressione if
può essere il tipo di A
. Definirò spesso una routine
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
per dire che il codice non dovrebbe essere raggiunto. Poiché il suo tipo è Nothing
, unreachable(s)
può ora essere utilizzato in qualsiasi if
o (più spesso) switch
senza influenzare il tipo di risultato. Ad esempio
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
Scala ha un tale tipo di Nothing.
Un altro caso d'uso per Nothing
(come menzionato nella risposta di Karl) è List [Nothing] è il tipo di liste di cui ognuno dei membri ha tipo Nothing. Quindi può essere il tipo della lista vuota.
La proprietà chiave di Nothing
che fa funzionare questi casi d'uso è non che non ha valori (anche se in Scala, ad esempio, non ha valori), è che è un sottotipo di ogni altro tipo.
Supponiamo che tu abbia una lingua in cui ogni tipo contiene lo stesso valore: chiamiamolo ()
. In tale linguaggio il tipo di unità, che ha ()
come unico valore, potrebbe essere un sottotipo di ogni tipo. Questo non lo rende un tipo di fondo nel senso che significava l'OP; l'OP era chiaro che un tipo di fondo non contiene valori. Tuttavia, poiché si tratta di un tipo che è un sottotipo di ogni tipo, può avere lo stesso ruolo di un tipo in fondo.
Haskell fa le cose in modo un po 'diverso. In Haskell un'espressione che non produce mai un valore può avere il tipo forall a.a
. Un'istanza di questo tipo di schema si unificherà con qualsiasi altro tipo, quindi agisce effettivamente come un tipo di fondo, anche se Haskell (standard) non ha la nozione di sottotipizzazione. Ad esempio la funzione error
del preludio standard ha lo schema di tipo forall a. [Char] -> a
. Quindi puoi scrivere
if E then A else error ""
e il tipo dell'espressione sarà uguale al tipo di A
, per qualsiasi espressione A
.
L'elenco vuoto in Haskell ha lo schema dei tipi forall a. [a]
. Se A
è un'espressione il cui tipo è un tipo di lista, quindi
if E then A else []
è un'espressione con lo stesso tipo di A
. Il tipo di []
è uguale al tipo [error ""]
, che indica che l'elenco vuoto non è l'unico valore del suo tipo.