2014-07-17 40 views

回答

7

如果要指定可以使用的Option類型:

無:選項[字符串]

冒號是明確的類型註釋。

1

您可以與scalaz:

import scalaz._ 
import Scalaz._ 

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

我知道你寫了,我的觀點是我是否可以指定類型爲無像:val a:None [String] = – jinglining

8

Option是一個參數化的類型和被定義爲這樣:

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

它被其他2類擴展:

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

case object None extends Option[Nothing] 

雖然Some可以採取任何類型的參數,None是一個Option的特殊實例/單例,參數爲Nothing。此外Option在其類型參數[+A]中是協變的,這意味着Option[Nothing]可用於任何其他參數類型爲Option的地方,因爲Nothing擴展了Scala中的所有類型。因此,不需要創建任何其他值來表示Nothing值,單身人士None將足以滿足所有情況。

在可擴展性方面Option是一個密封的抽象類,所以你不能擴展它。由於它們是案例類,因此無法擴展其子類SomeNone

通常,您甚至不需要嘗試寫入類似None[String]的東西,因爲更具體的Option類型是在上下文中的某處定義的。例如,作爲函數參數:

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

或細化:

val o: Option[String] = None 

而且,你真的不在乎什麼類型的選擇是,如果它是一個Nothing值,你不能無論如何都無法得到任何東西,它就像Java中的null但具有Monadic行爲。

有人提到你可以在scalaz中做類似的事情:none[String]。這只是一種語法糖,雖然非常方便,但在某些類型必須註釋的情況下,要減少冗長。它的定義是這樣的:

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

感謝您的寫作 – jinglining

+0

@Alkk Izmailov:標準庫中已存在'none'方法:'Option .empty'。 –

+0

這不是我的方法,我從scalaz複製'none';) –

26

我很驚訝,沒有人提到的Option.empty存在:

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

注意,在許多情況下,簡單地使用None其中一個Option[String]預計將正常工作。 或者換句話說,(如圖阿列克謝Izmailov),以下是corrrect:

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

這是因爲None延伸Option[Nothing],所以憑藉Option是協變(和Nothing作爲一個子類型的每個其他類型),None對於任何T總是與Option[T]兼容。

這也是爲什麼類型歸屬也是一個精細的選擇項(在這裏你確實需要對選項的類型明確,通過例如,如果需要它來驅動類型推斷的情況下):

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

+1爲'empty' - 與scalaz沒有太大區別 –

+0

是'Option.empty [Type]'是最佳做法。同樣,對於空列表,這樣的人應該做'List.empty [Type]' – samthebest

+0

@samthebest'Option.empty'比顯式類型註釋更好嗎?只是好奇 – acjay

相關問題