2014-10-01 19 views
1

考慮以下類型定義:隱式轉換在Scala中如何工作?

type Set = Int => Boolean 

我可以聲明返回一組兩種方式

def singletonSet(elem: Int): Set = 
    value => value == elem 

def singletonSet(elem: Int): Set = 
    Set(elem) 

第二個定義的函數使用Set從斯卡拉標準庫而不是聲明的類型,但Scala如何隱式轉換爲聲明的類型Set?隱含的轉換對我來說似乎很奇怪。

爲了闡明第二個定義,我在下面的有效代碼改變類型的名稱:

type SetX = Int => Boolean 

def singletonSet(elem: Int): SetX = 
    Set(elem) 

回答

0

Set有一個apply函數A => Boolean,對於每個A,如果它存在於Set中,則返回true;如果不存在,則返回false(它稱爲'contains'函數)。例如:

val sx = Set(1,2,3) 
sx(1) // true 
sx(5) // false 

在單例集中,您創建一個帶有一個元素的Set [Int]並返回「apply」函數。
所以實際上,singletonSet可以定義爲:

def singletonSet(elem: Int) = Set(elem).contains _