2011-05-12 24 views
4

我有以下代码:斯卡拉强调使用简化函数文本的语法

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)) 
         ^

编译器,我不明白对方:(

最好的问候,

斯坦

+0

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

回答

3

首先,请注意

val m = x.min 

你想要做什么,

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

我会留给你阅读更多关于这些东西(关于收藏的最小方法和折叠;注意这些不如你写的那么快)。

问题在于,编译器迷失于你的意思,以及在编写下划线时使用什么有效类型,以及何时添加类型信息,认为您正在尝试编写函数right有并将其分配给m。但当然m是一个Int,而不是一个函数,所以它抱怨。

只需明确写下。这只是一些额外的字符:

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

谢谢雷克斯!我试图理解使用下划线简化表达式的细节,而不是计算最小值。您的解决方案:val m =(Int.MaxValue /:x)(_ min _),非常整齐!干杯! – Stan