2014-08-29 65 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