2014-07-17 3 views

risposta

7

Se si desidera specificare il tipo di Option si potrebbe usare:

Nessuno: opzione [String]

I due punti sono un'annotazione di tipo esplicito.

1

È possibile con scalaz:

import scalaz._ 
import Scalaz._ 

none[String] // res0: Option[String] = None 
+0

So che scrivo, il mio punto è se posso specificare il tipo None Like: val a: None [String] = – jinglining

8

Option è un tipo parametrico ed è definito come tale:

... sealed abstract class Option[+A] ... 

è essere prolungato di altri 2 classi:

final case class Some[+A](x: A) extends Option[A] 

e

case object None extends Option[Nothing] 

Mentre Some può prendere qualsiasi tipo di un argomento, None è una speciale instance/singleton di un Option parametrizzati con Nothing. Inoltre Option è covariante nell'argomento tipo [+A] che significa che Option[Nothing] può essere utilizzato ovunque sia previsto Option con qualsiasi altro tipo di argomento, poiché Nothing estende tutti i tipi in Scala. Quindi non è necessario creare altri valori per rappresentare un valore Nothing, un singleton None sarà sufficiente per tutti i casi.

In termini di estensibilità Option è una classe astratta sigillata, quindi non è possibile estenderla. Non è possibile estendere le sottoclassi Some e None poiché si tratta di classi di casi.

In genere non è nemmeno necessario provare a scrivere qualcosa come None[String] perché il tipo più specifico Option è definito da qualche parte nel contesto. Per esempio, come argomento di funzione:

def f(o: Option[String]) = ...; f(None) 

o come affinamento:

val o: Option[String] = None 

Inoltre, davvero non importa che tipo di opzione è se si tratta di un valore Nothing, non è possibile ottenere qualcosa di fuori comunque, è come un null in Java, ma con comportamento monadico.

E 'stato detto che si può fare qualcosa di simile in scala: none[String]. Questo è solo uno zucchero sintassi, anche se molto conveniente, per ridurre la verbosità in alcuni casi in cui i tipi devono essere annotati.E 'definita come tale:

final def none[A]: Option[A] = None 
+0

Grazie per quello che scrivi – jinglining

+0

@Aleksey Izmailov: Il tuo metodo 'none' esiste già nella libreria standard:' Opzione .empty'. –

+0

non è il mio metodo, ho copiato 'none' da scalaz;) –

26

Sono sorpreso che nessuno ha menzionato l'esistenza di Option.empty:

scala> Option.empty[String] 
res0: Option[String] = None 

nota che in molti casi semplicemente utilizzando None dove un Option[String] si prevede funzionerà benissimo. O in altre parole, (come mostrato da Aleksey Izmailov), il seguente è corrrect:

def f(o: Option[String]) = ...; f(None) 

Questo perché None estende Option[Nothing], in forza di Option essere covariante (e Nothing essendo un sottotipo di ogni altro tipo), None è sempre compatibile con Option[T] per qualsiasi T.

è anche per questo tipo di attribuzione è anche una valida alternativa (per i casi in cui si ha bisogno di essere esplicito del tipo di opzioni, per esempio, se è necessario per guidare l'inferenza dei tipi):

scala> None: Option[String] 
res0: Option[String] = None 
+0

+1 per 'empty' - non molto diverso dal scalaz –

+0

Sì" Option.empty [Type] "è la procedura migliore. Allo stesso modo per le liste vuote e tale dovrebbe fare 'List.empty [Type]' – samthebest

+0

@samthebest Ci sono ragioni per cui 'Option.empty' è meglio dell'annotazione di tipo esplicita? Solo curioso: – acjay

Problemi correlati