我正在学习Scala。我有一个Scala函数,可以返回另一个函数。我在Scala中遇到过3种方法(可能还有更多)。在这个特定的代码中,第3个选项似乎没有编译,但我已经看到这种技术在其他地方使用,但无法解决为什么它在这种情况下不起作用。
在这个相当人为的例子中,我有一个函数,它接受一个Int并返回一个将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) ^
答案 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