2009-11-13 4 views
14

Il tipo scala Nothing rappresenta (a quanto ho capito) il fondo della gerarchia di tipi, indicato anche dal simbolo ⊥. Cioè, Nothing è un sottotipo di un dato tipo. Il requisito per un tipo Nothing è explained well by James Iry per quelli di noi senza uno sfondo teorico nella teoria dei tipi!Se il tipo Nothing è nella parte inferiore della gerarchia di classi, perché non posso richiamare alcun metodo concepibile su di esso?

Quindi la mia domanda è, se Nothing è un sottotipo di ogni tipo, perché non posso chiamare i metodi di qualsiasi tipo su Nothing? Ovviamente, non posso istanziare Niente, ma perché non compila il seguente?

var n: Nothing = _ 

def main(args: Array[String]) { 
    println(n.length) //compile error: value length is not a member of Nothing 
} 

Sicuramente come Nothing è un sottotipo di String questo dovrebbe essere OK? Nota che il seguente compila bene!

var n: Nothing = _ 

def foo(s: String) : Int = s.length 

def main(args: Array[String]) { 
    println(foo(n)) 
} 

come fa:

def main(args: Array[String]) { 
    println(n.asInstanceOf[String].length) 
} 
+0

Un'altra cosa da considerare è che in 'n.length' non c'è modo per Scala di sapere quale metodo' lunghezza' di cui stai parlando - e devi saperlo prima ancora di poter pensare se i suoi argomenti (o "questo" argomento) ha il tipo giusto. In 'pippo (n)' è già chiaro quale. – Owen

risposta

15

Mentre Nothing è un sottotipo di tutto, non si ereditano qualsiasi metodo ad eccezione di quelli in Any. Questo perché Nothing è più orientato verso la fine funzionale della lingua. È necessario per cose come Option e List, ma solo come tipo , non come classe.

La distinzione qui è un po 'strana per quelli provenienti da uno sfondo orientato agli oggetti, ma il fatto è che la sottotipizzazione come concetto è molto diversa da OOP. Certo, l'orientamento agli oggetti implica davvero sottotipizzazione in qualche forma, ma il contrario non è vero. I tipi di Benjamin Pierce fanno un buon lavoro di presentazione della lingua F_< (pronuncia "F sub"), che serve come esempio minimo di una lingua con sottotipizzazione (ma non OO).

Ora, con tutto ciò che detto, sono d'accordo sul fatto che il fatto che Nothing sia immune dalle normali regole di ereditarietà sembra un po 'incoerente. Tuttavia, da un punto di vista teorico, ha perfettamente senso.

2

suppongo Nothing potuto accettare qualsiasi metodo, ed eseguire un'operazione di serie su tutti loro (un'eccezione). Questo non sarebbe molto utile, però.

Presentando un errore di compilazione, il compilatore avverte il programmatore che un tipo che probabilmente non voleva, Nothing, è stato inferito in qualche modo in un determinato punto del codice.

+0

Ma non posso chiamare 'toString' su niente, mi stavo chiedendo se c'è qualcosa di brutto che tratta Niente come un caso speciale dal punto di vista del compilatore. O se la mia teoria dei tipi non fosse corretta ei metodi supportati da un tipo * e il tipo stesso * non sono necessariamente correlati –

+0

Suppongo che l'idea fosse di effettuare una verifica in fase di compilazione laddove possibile. Non è brutto, è buono, quando invece di un errore di runtime si ottiene uno in fase di compilazione. –

0

È possibile chiamare toString su Nothing variabile a causa di esso s defintion:
final trait Nothing extends Any
E toString è membro della Any. Penso che lo scaleratore compili lo Nothing nei limiti del tipo e lo consideri come qualsiasi altro tratto in tutti i casi. Lasciare invocare qualsiasi metodo su variabile con tipo di Nothing sarà molto strano, credo.

+0

Ma c'è ancora qualche trattamento speciale in corso. Dal tipo * signature * di 'Nothing', non posso dire che si estende a ogni altro tipo. –

+1

Ah quindi è un tratto, non una classe. Quindi puoi solo chiamare i metodi che sono esplicitamente definiti dal tratto. Questo spiegherebbe molto. – jqno

+1

@oxbow_lakes: trattamento speciale ben descritto nelle specifiche per cui il compilatore lo tratta in modo specifico in termini di limiti di tipo, ad es. per ogni tipo T segue è vero: Niente