如何在scala数组集合中使用文字参数?

如何在scala数组集合中使用文字参数?,scala,collections,parameters,literals,forall,Scala,Collections,Parameters,Literals,Forall,我需要帮助: 例如: val myArray= Array(1, 2, 4, 5, -1, -7, 11, 29) 我明白这一点:myArray.exists(x$1.monary_$bang.$percent(2)。$eq$eq(0(x$2))) myArray.count(!%2==0())” 我有Eclipse4.4。Luna.两次使用uuu>就定义了一个具有两个参数的函数,这是一个非常奇怪的参数。编译器告诉您,当它试图派生两个参数的类型时,它无法理解您的语句,这是不可能的 在之前的案

我需要帮助:

例如:

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(_) )"
“错误:缺少扩展函数的参数类型((x$1:,x$2)=>x$1.monary_$bang.$percent(2)。$eq$eq(0(x$2)))
myArray.count(!%2==0())”

我有Eclipse4.4。Luna.

两次使用uuu>就定义了一个具有两个参数的函数,这是一个非常奇怪的参数。编译器告诉您,当它试图派生两个参数的类型时,它无法理解您的语句,这是不可能的

在之前的案例中,这是可能的,例如

myArray.exists(_ < 0) 
另一种选择是

def xyz(n: Int) = n % 2 == 0
myArray.forall(!xyz(_))

更好的错误消息应该是“forall需要一个函数Int=>Bool”。我认为这是不可能的,因为Scala中存在隐式。您可以在Martin Odersky的Scala书的第8章中阅读更多关于这方面的内容。

这与这个问题中的内容相同:。注意:
也是一个函数

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

myArray.count(!(\u%2==0))
在这个代码段中,由于表达式
\uU%2==0
被括在括号中,编译器将其本身解析为匿名函数,而不是整个
!(%2==0)
正如您所料

将括号中的内容视为函数,编译器不知道为占位符推断什么类型。您可能认为可以通过添加注释来解决此问题

myArray.count(!((:Int)%2==0))
但是这也不行,因为您实际上是在应用一元
运算符到您创建的匿名函数

要解决这个问题,您可以简化谓词

myArray.count(%2!=0)
…或完全删除占位符

myArray.count(n=>!(n%2==0))

编辑:尽管上述建议可能是解决问题的最佳方法,但它们并不能直接解决您在输入以下(无效)表达式时收到的错误消息:

myArray.count(!\u%2==0(\u))
这里有两个问题。第一个是匿名函数
\u%2==0
没有用括号括起来,这导致编译器相信整个表达式
!\u%2==0(41;
是两个变量的匿名函数

如果我们将匿名函数括在括号中,则

myArray.count(!(%2==0)())
我们已经取得了进展,因为编译器不再寻找两个参数,但它无法推断嵌入函数中占位符的类型,因此我们必须对其进行注释

最后,我们有

myArray.count(!((:Int)%2==0)()

这正如预期的那样有效。它当然没有上面给出的解决方案那么优雅,但确实有效。

你能给出
xyz
的确切定义吗?我还想知道为什么会有
myArray.count
出现在错误中。xyz是这个%2==0看看错误消息:((x$1:,x$2)=>x$1。一元的$bang.$percent(2)。$eq$eq(0(x$2))。发生了与你描述的不一样的事情。@uberwach你说得对。我刚刚编辑了我的答案以解决错误消息。
myArray.forall( _ % 2 != 0)
def xyz(n: Int) = n % 2 == 0
myArray.forall(!xyz(_))