Scala中minimumSize函数语法糖解析:柯里化与函数字面量说明
解析Scala中
minimumSize的语法糖实现逻辑 咱们先把你提到的代码再贴出来,方便对照:
type EmailFilter = Email => Boolean val minimumSize: Int => EmailFilter = n => email => email.text.size >= n
你已经搞懂第一行是给Email => Boolean这个函数类型起了别名EmailFilter,那咱们重点拆解第二行的语法糖逻辑:
第一步:先理清类型签名
Int => EmailFilter这个类型,替换掉EmailFilter的别名后,其实等价于Int => (Email => Boolean)。换句话说,minimumSize是一个高阶函数:它接收一个整数参数,返回另一个函数——这个返回的函数接收Email,返回Boolean。
第二步:拆解右侧的匿名函数写法
右侧的n => email => email.text.size >= n是Scala的语法糖,省略了外层的括号。完整的写法应该是:
n => (email => email.text.size >= n)
咱们逐部分看:
- 最外层的
n => ...:这是一个匿名函数,参数是n(整数类型)。 - 箭头后面的
email => email.text.size >= n:这是另一个匿名函数,它接收email参数,然后判断email.text的长度是否大于等于n。而且这里的n是从外层函数捕获的变量,形成了闭包——也就是说,当你用某个具体的整数(比如100)调用minimumSize时,返回的过滤器函数会记住这个n=100的值。
第三步:实际调用的例子
比如你可以这么用这个函数:
// 创建一个要求文本长度至少为100的过滤器 val longEmailFilter: EmailFilter = minimumSize(100) // 用这个过滤器检查某封邮件 val isLongEnough = longEmailFilter(myEmail) // 返回true或false
这种写法的好处就是复用逻辑:你不用为每个长度阈值都写一遍email => email.text.size >= X的代码,只需要调用minimumSize(X)就能生成对应的过滤器,完美贴合那篇文章讲的“DRY(Don't Repeat Yourself)”原则。
内容的提问来源于stack exchange,提问作者Kumar Waghmode
相关产品推荐
相关产品推荐

