Использование символов подчеркивания в 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)
Другие вопросы по тегам