Scala Currying和函数文字

时间:2018-05-17 13:52:31

标签: scala lambda types currying function-literal

我正在阅读this page in the cython docs,其中我遇到了以下代码。

{{1}}

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

2 个答案:

答案 0 :(得分:14)

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

Int => (Email => Boolean)

相同(因为=>的右关联性)
Int => Email => Boolean 

这与

完全一致
n   => email => (email.text.size >= n)

基本上只是说:给出一个数字n,当有且仅当电子邮件的长度为至少email ,以便例如

true

返回一个行为就像

的闭包
n

即。它会过滤所有长度大于或等于100的电子邮件。因此,通过适当定义的示例邮件minimumSize(100) email => email.text.size >= 100 ,您将获得:

shortMail

答案 1 :(得分:5)

names <- c("Jackson", "Smith", "Johnson", "Richards", "Matthews", "Redmond", "Phillips") scores <- c(.99, .65, .73, .89, .88, .92, .87) level <- c(10,11,10,11,11,11,11) grades <- cbind.data.frame(names, scores, level) Gradesplit <- split(grades, grades$level) plotdata <- function(grades) { ggplot(data = grades, aes(x = names, y = scores, fill = scores))+ geom_bar(stat = "identity", position = "dodge")+ theme(axis.text.x=element_text(angle= 45, vjust=.5)) + ggtitle("test scores by level- February 2018", grades$level)} lapply(Gradesplit, plotdata) 功能是 curried 功能。

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

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

让我们描述一下:

的用法
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Daniel\source\repos\DatabaseInteraction2\DatabaseInteraction2\SimpleDatabase.mdb";

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

n => email => email.text.size >= n   

您将在此时获得:

n

接下来,您通过电子邮件致电minimumSize(2) // partially applies the minimumSize function with 2 as n

val nextFunction = email => email.text.size >= 2

此时你会得到一个布尔值:

nextFunction

所以,如果我们总结一下:

我们从nextFunction(Email("anemail@domain.com")) 开始,然后是val bool = Email("anemail@domain.com").text.size >= 2 ,然后是Int

Email

通过仔细查看此签名,您将识别Boolean签名 让我们替代:

Int => Email => Boolean

我们的想法是让EmailFilter充当模板,您可以使用更高级别的功能进行参数化。
在这里,我们参数化了电子邮件文本大小比较,以便我们可以保持Int => EmailFilter 通用。

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