代码之家  ›  专栏  ›  技术社区  ›  Kumar Waghmode

Scala Currying和函数文本

  •  4
  • Kumar Waghmode  · 技术社区  · 6 年前

    我在看书 the-neophytes-guide-to-scala-part-10 在那里我遇到了以下代码。

    type EmailFilter = Email => Boolean
    
    val minimumSize: Int => EmailFilter = n => email => email.text.size >= n
    

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

    2 回复  |  直到 6 年前
        1
  •  14
  •   Andrey Tyukin    6 年前

    这里没有任何语法上的糖分,只有原始的lambda表达式。 如果你插上电源 type EmailFilter 定义到第二行的类型中,您可以获得

    Int => (Email => Boolean)
    

    这是相同的(因为 => )作为

    Int => Email => Boolean 
    

    这与

    n   => email => (email.text.size >= n)
    

    这基本上只是说: 给定一个数字 n ,创建一个电子邮件筛选器 email 返回 true 当且仅当电子邮件长度至少为 N 例如

    minimumSize(100)
    

    返回一个行为与

    email => email.text.size >= 100
    

    i、 e.过滤所有长度大于或等于100的电子邮件。因此,通过适当定义的示例邮件 shortMail longMail ,您将获得:

    minimumSize(100)(shortMail) // false
    minimumSize(100)(longMail) // true
    
        2
  •  5
  •   Andrey Tyukin    6 年前

    这个 minimumSize 函数是 咖喱 作用

    Curry是一种将函数调用拆分为多个连续子函数调用的方法。

    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 
    

    我们的想法是 电子邮件筛选器 充当 样板 ,可以用更高的函数参数化。
    在这里,我们参数化了电子邮件文本大小比较,以便我们可以保持 电子邮件筛选器 通用的

    记住,函数式编程就是关于组合函数的。

    推荐文章