Использование символов подчеркивания в Scala для упрощения синтаксиса функциональных литералов
У меня есть следующий код:
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))
^
Компилятор и я не понимаем друг друга:(
С наилучшими пожеланиями,
Стан
1 ответ
Во-первых, обратите внимание, что
val m = x.min
делает то, что вы хотите, как и
val m = (Int.MaxValue /: x)(_ min _)
Я предоставлю вам больше информации об этих вещах (метод min для коллекций и складок; обратите внимание, что они не такие быстрые, как вы написали).
Проблема в том, что компилятор теряет смысл того, что вы имеете в виду, и какие допустимые типы могут быть, когда вы пишете подчеркивание, и когда вы добавляете информацию о типе, он думает, что вы пытаетесь написать функцию прямо здесь и назначить ее m
, Но конечно m
является Int
, а не функция, поэтому жалуется.
Просто напишите это явно. Это всего лишь несколько дополнительных символов:
x.foreach(i => m = m min i)