Как «применить» к результатам функции без параметров - PullRequest
8 голосов
/ 22 января 2011

Это работает:

List(3, 1, 2).sorted apply 1
res1: Int = 2

И это работает:

var x = List(3, 1, 2).sorted
x: List[Int] = List(1, 2, 3)
x(1)
res2: Int = 2

но это не так:

List(3, 1, 2).sorted (1)

error: type mismatch;
 found   : Int(1)
 required: Ordering[?]
       List(3, 1, 2).sorted (1)
                             ^

И даже в круглых скобках парсер не указывает, что я хочу:

(List(3, 1, 2).sorted)(1)

error: type mismatch;
 found   : Int(1)
 required: Ordering[?]
       (List(3, 1, 2).sorted)(1)

Это похоже на естественное выражение. Что я делаю не так?

Ответы [ 4 ]

6 голосов
/ 22 января 2011

Это работает:

(Listed(3, 1, 2).sorted _)(1) * * 1004

но я не уверен, гораздо ли удобнее пользоваться чем:

Listed(3, 1, 2).sorted apply 1.

Я бы все равно пошел на последнее.

5 голосов
/ 22 января 2011

Я думаю, вы должны оставить заявку. Причина в том, что сортировка не «без параметров», она определяется как

def sorted [B >: A] (implicit ord: Ordering[B]) : List[A]

Поскольку это неявный параметр, Ordering [Int] обычно предоставляется автоматически, но если вы используете parens, компилятор считает, что вы хотите указать другой Ordering [Int] (скажем, в обратном направлении).

3 голосов
/ 22 января 2011

Обязательный параметр можно указать следующим образом:

List(3, 1, 2).sorted(implicitly[Ordering[Int]])(1)

Хотя использование apply () выглядит короче и менее страшно.

2 голосов
/ 23 января 2011

Самое короткое, что вы могли бы сделать - не без небольшого снижения производительности, однако - это

class Allow_\[A](a: A) { def \ = a }
implicit def allowEveryone[A](a: A) = new Allow_\[A](a)

scala> List(1,3,2).sorted\(1)
res0: Int = 2

Если вы можете принять другого персонажа, это может быть лучше: <> в любом случае выглядит как parensи может быть прочитано как «пожалуйста, заполните неявные параметры, как обычно»:

class Allow_<>[A](a: A) { def <> = a }
implicit def allowEveryone[A](a: A) = new Allow_<>[A](a)

scala> List(1,3,2).sorted<>(1)
res0: Int = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...