3? scala中从函数返回函数的方法 - 1不编译 - 不明白为什么

时间:2015-03-27 06:09:03

标签: function scala

我正在学习Scala。我有一个Scala函数,可以返回另一个函数。我在Scala中遇到过3种方法(可能还有更多)。在这个特定的代码中,第3个选项似乎没有编译,但我已经看到这种技术在其他地方使用,但无法解决为什么它在这种情况下不起作用。

在这个相当人为的例子中,我有一个函数,它接受一个I​​nt并返回一个将Int映射到Boolean的函数。

  def intMapper1(elem: Int): Int => Boolean = {
    def mapper(x: Int): Boolean =
      x == elem
    mapper
  }

  def intMapper2(elem: Int): Int => Boolean = (x: Int) => x == elem

  def intMapper3(elem: Int)(x: Int) = x == elem

  val m1 = intMapper1(2)
  val m2 = intMapper2(4)
  val m3 = intMapper3(6)

我收到编译错误: 错误:(35,22)在对象FunSets中缺少方法intMapper3的参数; 如果要将其视为部分应用函数,请使用“_”跟随此方法   val m3 = intMapper3(6)                      ^

2 个答案:

答案 0 :(得分:2)

方法def intMapper3(elem: Int)(x: Int) = x == elem有两个参数列表,你只传递一个参数(即elem),这里缺少第二个参数(x)。而intMapper3不是higher order function。它没有将任何函数作为参数而不返回函数。这是一个常规方法,取两个参数列表并返回一个布尔值。

您可以从m3导出部分应用的函数val m3 = intMapper3(6)_。这就是编译器告诉你的。

答案 1 :(得分:1)

您的方法def intMapper3(elem: Int)(x: Int) = x == elem是scala中的一个简单函数。它需要两个参数“elem”和“x”并计算结果。

可以用作:

scala> intMapper3(2)(2)
res2: Boolean = true
scala> intMapper3(2)(1)
res3: Boolean = false

但是如果只传递一个参数,它将显示错误,因为intMapper3需要两个参数。

“intMapper1”函数可以通过以下方式调用:

scala> intMapper1(1)(2)
res0: Boolean = false
scala> intMapper1(1)(1)
res1: Boolean = true

在这种情况下,“intMapper1”的输出是一个函数,它接受Int类型的参数并返回一个布尔结果。

scala> val m1 = intMapper1(2)
m1: Int => Boolean = <function1>    
scala> m1(2)
res1: Boolean = true