Мой компилятор (2.9.1) согласен, здесь, похоже, ошибка, но компилятор говорит вам, что делать:
error: missing arguments for method msort in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
Итак, это работает:
val intSort = msort((x : Int, y : Int) => x < y) _
Поскольку подразумевается тип intSort
, компилятор, похоже, не знает, собирались ли вы применить частично или пропустили аргументы.
_
можно опустить, когда компилятор может определить из ожидаемого типа, что частично примененная функция - это то, что предназначено. Так что это тоже работает:
val intSort: List[Int] => List[Int] = msort((x: Int, y: Int) => x < y)
Это, очевидно, более многословно, но чаще вы будете использовать это без каких-либо дополнительных шаблонов, например, если msort((x: Int, y: Int) => x < y)
был аргументом функции, тип параметра которой уже известен как List[Int] => List[Int]
.
Редактировать: Страница 181 текущей редакции Спецификации языка Scala упоминает ужесточение правил для неявного преобразования частично примененных методов в функции начиная с Scala 2.0. Существует пример неверного кода, очень похожего на код в Scala на примере , и он описывается как «ранее действующий код».