【问题标题】:Scala underscore use to simplify syntax of function literalsScala 下划线用于简化函数字面量的语法
【发布时间】:2011-05-12 17:08:44
【问题描述】:

我有以下代码:

var x = Array(1,3,4,4,1,1,3)
var m = Int.MaxValue
x.foreach((x)=>(m = m min x))

我试图将最后一句话简化为:

x.foreach((m = _ min m))

但是翻译说:

scala>  x.foreach((m = _ min m))     
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.min(m))
    x.foreach((m = _ min m))
                   ^

我试图更明确地说明类型:

scala>  x.foreach((m = (_:Int) min m))
<console>:8: error: type mismatch;
found   : (Int) => Int
required: Int
    x.foreach((m = (_:Int) min m))
                           ^

编译器和我看不懂:(

最好的问候,

斯坦

【问题讨论】:

  • 似乎= 正在分隔表达式。我没想到会发生这种情况......而且我确实测试了代码,但它显然不起作用,所以我删除了我的答案。

标签: scala lambda syntax function-literal scala-placeholder-syntax


【解决方案1】:

首先,请注意

val m = x.min

做你想做的事

val m = (Int.MaxValue /: x)(_ min _)

我会留给你阅读更多关于这些东西的内容(关于集合和折叠的 min 方法;请注意,这些没有你写的那么快)。

问题是编译器在你写下划线时迷失了你的意思以及可能是什么有效类型,当你添加类型信息时它认为你正在尝试编写一个函数就在那里并将其分配给m。但当然mInt,而不是函数,所以它会抱怨。

只要明确地写出来。这只是几个额外的字符:

x.foreach(i => m = m min i)

【讨论】:

  • 谢谢雷克斯!我试图了解使用下划线简化表达式的细节,而不是计算最小值。您的解决方案:val m = (Int.MaxValue /: x)(_ min _),非常简洁!干杯!
猜你喜欢
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多