这究竟是一个多余的功能?

时间:2014-12-10 14:45:39

标签: scala currying

我正在阅读Scala中的函数式编程,并通过不同的练习。我遇到了currying。

有人可以向我解释一下这个有问题的功能吗?这是如何工作的?我似乎能理解这段代码。与我在不同的博客上看到的关于Scala中的currying的那些相比。

def curry[A,B,C](f: (A, B) => C): A => (B => C) =  a => b => f(a,b)

是来自a =>的a b => f(a,b)一个函数,如果是这样,它的论点是什么?

还要更新这是什么意思? a中的a => b => f(a,b)表示什么?是一个函数,它将返回一个名为b的函数,它接受一个参数并返回一个函数?

4 个答案:

答案 0 :(得分:1)

我假设您理解currying的概念,并且类型定义对您有意义:A => B => C

实施是:a => b => f(a,b),您可以将其读作:

... = { a => 
        { b => 
          { f(a,b) }
        }
      }

因此,a是接受为A => (B => C)类型函数输入的参数。此函数返回第二个函数 - 类型为B => C,需要b:B并将f应用于这两个函数。

编辑:如果它可以帮助您理解,您可以使用这个非常详细的版本:

def curry[A,B,C](f: (A, B) => C): A => (B => C) = {

  def aToBToC(a: A): B => C = {

    def bToC(b: B): C = {
      f(a,b)
    }

    bToC
  }

  aToBToC
}

看看我如何在嵌套作用域中定义私有函数? (我没有在REPL中尝试过,也许有一个错字,但你明白了。)

答案 1 :(得分:1)

您定义了一个函数 curry ,它将另一个函数作为参数。该函数的返回类型为A => (B => C),也是AB => C的函数。

之后,您定义了A => (B => C)的实现,同样针对给定a返回函数b => f(a,b)

示例:

def plus(a: Int, b:Int): Int = a + b

plus的咖喱版:

scala> def plusC(a:Int): Int => Int = plus(a, _)
plusC: (a: Int)Int => Int

scala> plusC(1)
res4: Int => Int = <function1>

scala> res4(10)
res5: Int = 11

答案 2 :(得分:1)

这是不是一个curried函数。这是一种咖喱方法(注意:函数和方法在Scala中是非常不同的概念),即 curry的方法。它的返回值是一个curried函数;它接受两个参数的函数,返回一个curried函数。

答案 3 :(得分:0)

def curry[A,B,C]不是curried函数本身,它只是展示了如何将带有两个参数f: (A, B) => C的函数转换为curried函数A => (B => C)a => b => f(a, b)表示该函数接受参数a并返回函数b => f(a, b),后者又返回最终值f(a, b)