2014-10-15 8 views
5

Dato che Seq.view restituisce un SeqView, mi sarei aspettato Set.view per restituire un SetView, ma tale visualizzazione non esiste; Set.view restituisce invece un IterableView.Perché Scala ha SeqView ma non SetView?

Sfortunatamente, IterableView mancano alcuni metodi, ad esempio contains. Confronta questi, ad esempio:

Seq(1, 2, 3).view.map(_ * 2).contains(4) // returns true 
Set(1, 2, 3).view.map(_ * 2).contains(4) // error 

C'è un motivo particolare per cui non esiste alcuna classe SetView?

Inoltre, c'è qualche ragione per cui Iterable non ha un metodo contains (dato che questo è fondamentalmente un caso speciale di ricerca)?

Data la situazione di cui sopra, v'è una migliore alternativa a questo quando si lavora con i set (in altre parole, qual è la migliore pratica in Scala):

Set(1, 2, 3).view.map(_ * 2).find(_ == 4).isDefined 
+1

Informazioni su contiene: http://stackoverflow.com/questions/2925765/why-does-iterator-have-a-contains-method-but-iterable-does-not-in-scala-2-8 –

+1

Non proprio alternativa generale, ma 'Set (1, 2, 3) .exists (x => x * 2 == 4)' –

risposta

2

Non c'è SetView perché le viste sono un dolore nel collo per implementare e testare, e tale sforzo è meno degno di essere visto che le buone proprietà dei set generalmente richiedono di aver già creato con entusiasmo l'intero set (ad esempio la ricerca O(1) o O(log n)).

contains non è in Iterable proprio perché Set estende Iterable e Setcontains non dovrebbe digitare controllare a meno che non si chiede qualcosa che potrebbe essere nel set. Dal momento che Iterable è covariante, il suo contains dovrebbe ammettere che si sta chiedendo qualcosa (come lo per Seq).

Per risolvere il problema, è possibile notare che contains(x) fa la stessa cosa di exists(_ == x), e exists è su Iterable.

Problemi correlati