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



我需要帮助:

例如:

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意外地无法确定扩展函数的类型。注意:!也是一个函数

相关内容

  • 没有找到相关文章

最新更新