如何在 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:通过使用 _ 两次,您定义了一个带有两个参数的函数 - 这是一个非常奇怪的函数。编译器告诉您,当它尝试派生两个参数的类型时,它无法理解您的语句 - 这是不可能的。
在这之前的情况下,例如
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 上的类型擦除?或者,为啥我不能获取我的集合的类型参数?