2014-07-17 34 views

cevap

7

Eğer kullanabilirsiniz Option türünü belirtmek isterseniz:

Hiçbiri: Opsiyon [dize]

Kolon açık bir tür ek açıklamadır.

import scalaz._ 
import Scalaz._ 

none[String] // res0: Option[String] = None 
1

Sen scalaz ile can

bir tartışma her türlü alabilir iken
case object None extends Option[Nothing] 

, NoneNothing ile parametreli bir Option özel bir örneği/tekil olduğunu. Ayrıca, Option,, Nothing Scala'daki tüm türleri Nothing tüm türleri genişletdiğinden, Option[Nothing]Option herhangi bir yerde kullanılabileceği anlamına gelir. Yani, Nothing değerini temsil edecek başka değerler oluşturmaya gerek yoktur, tek bir None tüm durumlar için yeterli olacaktır.

Genişletilebilirlik açısından Option mühürlü bir soyut sınıftır, dolayısıyla genişletemezsiniz. Alt sınıfları Some ve None'u genişletemezsiniz, çünkü bunlar örnek sınıflardır.

Genellikle None[String] gibi bir şey yazmayı denemenize gerek yoktur, çünkü daha spesifik Option türü bağlamda bir yerde tanımlanmıştır. Örneğin, bir fonksiyon argüman olarak:

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

veya

bir incelik olarak:

val o: Option[String] = None 

Üstelik, gerçekten, bu bir Nothing değeri ise bir seçenek olduğunu tip umurumda değil yapamazsın bunun dışında bir şey olsun, Java'daki null gibi ama Monadic davranışıyla.

Scalaz: none[String]'da benzer bir şey yapabildiğinizden bahsedilmiştir. Bu, türlerin açıklanması gereken bazı durumlarda ayrıntıyı azaltmak için çok uygun olsa da, sadece bir sözdizimidir.Böyle olarak tanımlanan oluyor: çoğu durumda sadece bir Option[String] iyi çalışır bekleniyor None kullanarak o

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

Not:

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

: tip yakıştırma (o tip çıkarsama sürücü gerekli olup olmadığına örnek, seçenekler türüne açık olması gerekiyor durumlar için) ince bir alternatif de neden

Bu

da Yazdığınızı biliyorum, benim amacım tip olarak None belirtebilmem mümkün değil: val a: None [String] = – jinglining

8

Option bir parametreli türüdür ve bu şekilde tanımlanır::

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

o 2 diğer sınıflara uzatılabilir ediliyor:

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

ve

+0

Yazdıklarınız için teşekkürler – jinglining

+0

@Aleksey Izmailov: Sizin 'none' yönteminiz standart kütüphanede zaten var:' Seçenek .empty'. –

+0

bu benim yöntemim değil, '' scalaz'dan hiç kopyalamadım;) –

26

kimsenin Option.empty varlığından söz şaşırıyorum.

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

NoneOption sayesinde olmak kovariant bunu, Option[Nothing] uzanır, bu (ve Nothing her bir alt tipi söz konusu olur: ya da (Aleksey Izmailov ile gösterildiği gibi), diğer bir deyişle, aşağıdaki corrrect olan Diğer tür), None her zaman T için Option[T] ile uyumludur.

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

+1' boş '- scalaz –

+0

dan gerçekten çok farklı değil Evet 'Option.empty [Tür]' en iyi uygulamadır. Benzer şekilde boş listeler için ve böyle bir liste olmalıdır. List.empty [Tür] ' – samthebest

+0

@samthebest' Option.empty' açık tip ek açıklamadan daha iyi nedenler var mı? Sadece meraklı – acjay

İlgili konular