1

I need help for this:

for example:

val myArray= Array(1, 2, 4, 5, -1, -7, 11, 29)

I understand this : myArray.exists( _ < 0 )

And also I can understand this: myArray.count(_ % 2 == 0)

but how I can write at REPL this:

myArray.forall( !xyz(_) )     xyz is this _ % 2 == 0 like above

I get this error:

"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(_) )"

I have Eclipse 4.4. Luna.

4

3 回答 3

1

让我们看一下您的一个示例的变体:

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)(_))

这按预期工作。它当然不如上面介绍的解决方案那么优雅,但它确实有效。

于 2014-09-30T23:12:19.790 回答
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 Oderskys Scala 书的第 8 章中阅读更多关于这些内容的信息。

于 2014-09-30T22:52:15.480 回答
0

这与此问题相同:Scala 意外无法确定扩展函数的类型。注意:!也是一个函数

于 2014-09-30T22:52:23.667 回答