2014-08-29 62 views
0

我自學斯卡拉(從多年的Java的未來),我穿過下面的代碼,我不能完全神交傳來:理解類型的高階函數在斯卡拉

case class Email(subject: String, text: String, sender: String, recipient: String) 

type EmailFilter = Email => Boolean 
def newMailsForUser(mails: Seq[Email], f: EmailFilter) = mails.filter(f) 

val sentByOneOf: Set[String] => EmailFilter = 
    senders => email => senders.contains(email.sender) 

val notSentByAnyOf: Set[String] => EmailFilter = 
    senders => email => !senders.contains(email.sender) 

val minimumSize: Int => EmailFilter = n => email => email.text.size >= n 
val maximumSize: Int => EmailFilter = n => email => email.text.size <= n 

我找了份很難理解與缺少類型定義的丘壑:

val sentByOneOf: Set[String] => EmailFilter = 
    senders => email => senders.contains(email.sender) 

我創建使用def相同的功能,這我能理解:

def sentByOne(senders: Set[String], email: Email): (Set[String] => EmailFilter) = { 
    senders => email => senders.contains(email.sender) 
} 

這個類型來自哪個版本?另外,後一版本是否可取?

回答

4

短的答案,在該definiton:

val sentByOneOf: Set[String] => EmailFilter = 
    senders => email => senders.contains(email.sender) 

擴展爲:

val sentByOneOf: Set[String] => Email => Boolean = 
    senders => email => senders.contains(email.sender) 

類型:Set[String] => EmailFilter之後定義。所以傳遞給sentByOneOf的第一個值是Set[String],第二個值是EmailFilter,這是Email => Boolean的別名。

較長版本:

由於所有變量/ Scala中值類型可以冒號之後像它在本例中,或者它可以從它指的是表達來infered指定。所以在這裏:

類型的 sentByOneOf
val sentByOneOf = (senders: Set[String]) => (email: Email) => 
    senders.contains(email.sender) 

也將infered到sentByOneOf: Set[String] => (Email => Boolean)其中Email => Boolean有定義爲EmailFilter

Scala中function values的別名,這是你必須在這裏實際上是在FunctioN現實情況其中N是變量的數量。所以,你的功能sentByOneOf其實是這樣的:

val sentByOneOf = new Function2[Set[String], Email, Boolean] { 
    def apply(senders: Set[String], email: Email, pred: => Boolean): Boolean = senders.contains(email.sender) 
} 

順便說一句,你選擇了偉大的系列文章,但因爲比較困難首次與斯卡拉:)

+0

哪裏類型'senders'和'email'? – 2014-08-29 06:24:03