我正在阅读this page in the cython docs,其中我遇到了以下代码。
{{1}}
我理解了为函数创建类型别名EmailFilter的第一行,该函数接收电子邮件返回布尔值。但我不明白我们将电子邮件和数字作为输入的第二行,并通过检查大小返回布尔值。 请解码第二行并向我解释这个函数的语法糖代码。
答案 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
通用。
请记住,函数式编程就是编写函数。