该minimumSize
函数是一个柯里化函数。
Currying 是一种将函数调用拆分为多个顺序子函数调用的方法。
curry 函数有很多很好的优点,一个是它可以让你的函数更加可组合,通过延迟真实的数据源。
让我们描述一下用法:
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
这个想法是将EmailFilter
行为作为模板,您可以使用一些更高的功能进行参数化。
在这里,我们参数化了电子邮件文本大小比较,以便我们可以保持EmailFilter
通用性。
请记住,函数式编程就是组合函数。