Currying和Partial Function的实际例子

时间:2018-05-12 19:32:48

标签: scala currying

我是Scala的新手,最近还在学习Currying。我知道什么是currying和部分应用的功能。但我不明白为什么要使用Currying而不是多个参数。那么任何身体都可以帮助我提供一些例如讨好。

1 个答案:

答案 0 :(得分:2)

假设通过" currying"你的意思是具有多个参数列表的函数定义,两个最重要的优点是:

  1. 更好的类型推断:先前参数列表中的参数类型可用于后续参数列表中参数的类型推断。这有效:

    def delta[A](x: A)(f: A => A): A = f(x)
    delta(5)(x => x)
    

    但这里没有:

    def foo[A](x: A, f: A => A): A = f(x)
    foo(5, x => x) // error: missing parameter type
    

    最突出的例子可能是fold列表:

    val a = List(1, 2, 3)
    a.foldLeft("List:"){ (s, i) => s + " " + i }
    

    在此示例中,无需将类型归于si

  2. 您可以使用先前参数列表中的变量来定义默认参数:

    def f(x: Int)(y: Int, z: Int = x * x) = x + y * z // valid
    f(2)(3) // works
    
    def g(x: Int, y: Int, z: Int = x * x) = x + y * z // invalid
    
  3. 通过"部分应用的功能",通常意味着这样的事情:

    List(83,223,314,56,79).map(math.min(100, _))
    // output: List(83, 100, 100, 56, 79)
    

    此处,数学函数min首先用于创建部分应用的函数min(100, _),然后将其传递给map以截断列表中大于100的所有数字。 / p>

    如果您的意思是"部分应用curried函数",那么这里是一个带有curried函数的相同示例:

    def min(x: Int)(y: Int) = x min y
    List(83,223,314,56,79).map(min(100))
    

    正如您所看到的,咖喱版本比通常的"部分应用函数更简洁,更简洁。" -version。

    我不确定该怎么说"优点"部分应用的功能,除了你可以使用它们,并且不能使用它们是痛苦的。