Использование символов подчеркивания в Scala для упрощения синтаксиса функциональных литералов - PullRequest
5 голосов
/ 12 мая 2011

У меня есть следующий код:

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

Компилятор и я не понимаем друг друга: (

С уважением,

Stan

1 Ответ

4 голосов
/ 12 мая 2011

Во-первых, обратите внимание, что

val m = x.min

делает то, что вы хотите, как

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

Я предоставлю вам больше информации об этих вещах (метод min для коллекций и складок; обратите внимание, что они не так быстры, как написанные вами).

Проблема в том, что компилятор теряется из-за того, что вы имеете в виду, и из-за того, какие допустимые типы могут быть, когда вы пишете подчеркивание, и когда вы добавляете информацию о типе, он думает, что вы пытаетесь написать функцию прямо здесь и присвойте его m. Но, конечно, m - это Int, а не функция, поэтому он жалуется.

Просто напишите это явно. Это всего лишь несколько дополнительных символов:

x.foreach(i => m = m min i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...