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的所有电子邮件因此,具有适当定义的例如邮件shortMail和longMail,你会获得:
minimumSize(100)(shortMail) // false
minimumSize(100)(longMail) // true
Run Code Online (Sandbox Code Playgroud)
该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通用.
请记住,函数式编程就是编写函数.