Scala Currying和函数文字

Kum*_*ode 4 lambda types scala function-literal currying

我正在阅读-nophytes-guide-to-scala-part-10,其中我遇到了以下代码.

type EmailFilter = Email => Boolean

val minimumSize: Int => EmailFilter = n => email => email.text.size >= n
Run Code Online (Sandbox Code Playgroud)

我理解了第一行,其中为一个函数创建了类型别名EmailFilter,该函数接收电子邮件返回布尔值.但我不明白我们将电子邮件和数字作为输入的第二行,并通过检查大小返回布尔值.请解码第二行并向我解释该函数的语法糖代码.

And*_*kin 14

没有任何语法糖,只是原始的lambda表达式.如果将type EmailFilter定义插入第二行中的类型,则获得

Int => (Email => Boolean)
Run Code Online (Sandbox Code Playgroud)

这是相同的(因为权利相关性=>)

Int => Email => Boolean 
Run Code Online (Sandbox Code Playgroud)

这完全符合

n   => email => (email.text.size >= n)
Run Code Online (Sandbox Code Playgroud)

基本上只是说:给定一个数字n,创建一个电子邮件过滤器,当且仅当电子邮件的长度至少email为止true时给出返回n,以便例如

minimumSize(100)
Run Code Online (Sandbox Code Playgroud)

返回一个行为就像的闭包

email => email.text.size >= 100
Run Code Online (Sandbox Code Playgroud)

即,它与过滤器长度大于或等于100的所有电子邮件因此,具有适当定义的例如邮件shortMaillongMail,你会获得:

minimumSize(100)(shortMail) // false
minimumSize(100)(longMail) // true
Run Code Online (Sandbox Code Playgroud)


Mik*_*378 5

minimumSize功能是一个curried功能.

Currying是一种将函数调用拆分为多个顺序子函数调用的方法.

咖喱功能有很多好处,一个是通过推迟真实的数据源,它可以让你的功能更具组合性.

让我们描述一下:

n => email => email.text.size >= n   
Run Code Online (Sandbox Code Playgroud)

我们可以通过n仅传递参数来调用此函数:

minimumSize(2) // partially applies the minimumSize function with 2 as n 
Run Code Online (Sandbox Code Playgroud)

你会得到这个时间:

val nextFunction = email => email.text.size >= 2
Run Code Online (Sandbox Code Playgroud)

接下来nextFunction用电子邮件打电话:

nextFunction(Email("anemail@domain.com"))
Run Code Online (Sandbox Code Playgroud)

你将在这个时候获得一个布尔值:

val bool = Email("anemail@domain.com").text.size >= 2
Run Code Online (Sandbox Code Playgroud)

所以如果我们总结一下:

我们从a开始Int,然后是a Email,然后是Boolean:

Int => Email => Boolean
Run Code Online (Sandbox Code Playgroud)

通过仔细查看此签名,您将识别EmailFilter签名.
让我们替换:

Int => EmailFilter 
Run Code Online (Sandbox Code Playgroud)

我们的想法是将EmailFilter行为作为模板,您可以使用更高级的功能进行参数化.
在这里,我们参数化了电子邮件文本大小比较,以便我们可以保留EmailFilter通用.

请记住,函数式编程就是编写函数.