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

Posted

技术标签:

【中文标题】如何在 scala 数组集合中使用文字参数?【英文标题】:How do I use literal parameters with scala array collection? 【发布时间】:2014-09-30 22:30:23 【问题描述】:

我需要帮助:

例如:

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。露娜。

【问题讨论】:

你能给出xyz的确切定义吗 我也想知道为什么错误中出现myArray.count xyz 是这个 _ % 2 == 0 【参考方案1】:

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

myArray.count(!(_ % 2 == 0))

在这个 sn-p 中,由于表达式 _ % 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)(_))

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

【讨论】:

查看错误信息: ((x$1: , x$2) => x$1.unary_$bang.$percent(2).$eq$eq(0(x$2 )))。正在发生的事情与您描述的不同。 @uberwach 你是对的。我刚刚编辑了我的答案以解决错误消息。【参考方案2】:

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

在这之前的情况下,例如

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 章中阅读更多有关这些内容的信息。

【讨论】:

【参考方案3】:

这与这个问题相同:Scala unexpectedly not being able to ascertain type for expanded function。注意:! 也是一个函数

【讨论】:

以上是关于如何在 scala 数组集合中使用文字参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Scala中添加另一个参数时传递可变参数?

Scala,强制数组/集合参数的长度

如何绕过 Scala 上的类型擦除?或者,为啥我不能获取我的集合的类型参数?

Spark Scala:如何在 LIKE 语句中使用通配符作为文字

scala入门系列--数组

在scala中使用二维数组创建特定模式