我需要帮助:
例如:
val myArray= Array(1, 2, 4, 5, -1, -7, 11, 29)
我理解:myArray.exists( _ < 0 )
我也能理解:myArray.count(_ % 2 == 0)
但是我如何在REPL写这个:
myArray.forall( !xyz(_) ) xyz is this _ % 2 == 0 like above
我得到这个错误:
"error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.unary_$bang.$percent(2).$eq$eq(0(x$2)))
myArray.count( !_ % 2 ==0(_) )"
我有Eclipse 4.4。露娜。
让我们看看您的一个示例的变体:
myArray.count(!(_ % 2 == 0))
在这个代码段中,由于表达式_ % 2 == 0
被括在括号中,编译器将其本身解析为匿名函数,而不是像您所期望的那样解析整个!(_ % 2 == 0)
。
将括号中的内容视为函数,编译器不知道为占位符推断什么类型。你可能认为你可以通过添加注释来解决这个问题,给出
myArray.count(!((_: Int) % 2 == 0))
但这也不起作用,因为您实际上是在将一元!
运算符应用于您创建的匿名函数!
为了解决这个问题,你可以简化你的谓词。。。
myArray.count(_ % 2 != 0)
或者完全消除占位符。
myArray.count(n => !(n % 2 == 0))
编辑:尽管以上建议可能是解决问题的最佳方法,但它们并不能直接解决您输入以下(无效)表达式时收到的错误消息:
myArray.count(!_ % 2 == 0(_))
这里有两个问题。首先,您的匿名函数_ % 2 == 0
没有用括号括起来,这导致编译器相信整个表达式!_ % 2 == 0(_)
是一个由两个变量组成的匿名函数。
如果我们将匿名函数封装在括号中,我们就得到了
myArray.count(!(_ % 2 == 0)(_))
我们已经取得了进展,因为编译器不再寻找两个参数,但它无法推断嵌入函数中占位符的类型,所以我们必须对其进行注释
最后,我们有
myArray.count(!((_: Int) % 2 == 0)(_))
这是意料之中的事。它当然没有上面给出的解决方案那么优雅,但它确实有效。
通过使用_两次,你定义了一个有两个参数的函数-这是一个非常奇怪的函数。编译器告诉你,当它试图推导这两个参数类型时,它无法理解你的语句-这是不可能的。
在这之前的情况下是可能的,例如在中
myArray.exists(_ < 0)
编译器知道存在于Array[Int]上的函数期望函数Int为Bool。因此代码扩展到
myArray.exists((x : Int) => x < 0)
在你的情况下,你应该写:
myArray.forall( _ % 2 != 0)
另一种选择是
def xyz(n: Int) = n % 2 == 0
myArray.forall(!xyz(_))
一个更好的错误消息应该是类似于"forall期望函数Int=>Bool在这里"。我认为这是不可能的,因为Scala中存在隐词。你可以在Martin Odersky的Scala书的第8章中阅读更多关于这些东西的内容。
这与这个问题中的情况相同:Scala意外地无法确定扩展函数的类型。注意:!
也是一个函数