Краткая запись для одной анонимной функции arg (без подчеркивания) не работает должным образом - PullRequest
3 голосов
/ 06 июля 2011

Пройдя несколько примеров в сети, я понимаю, что существует способ написать анонимную функцию без подчеркивания, когда только один аргумент. Кроме того, я экспериментирую с методом span, который я никогда не знал. В любом случае, вот мой сеанс REPL:

scala> val nums = List(1, 2, 3, 4, 5)
nums: List[Int] = List(1, 2, 3, 4, 5)

scala> nums span (_ != 3)
res0: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 !=)
res1: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

Пока все хорошо. Но когда я пытаюсь использовать оператор «меньше чем»:

scala> nums span (_ < 3)
res2: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 <)
res3: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

Почему это ведет себя по-другому?

Ответы [ 3 ]

10 голосов
/ 06 июля 2011
scala> nums span (_ < 3)
res0: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

scala> nums span (3 >)
res1: (List[Int], List[Int]) = (List(1, 2),List(3, 4, 5))

3 < - это ярлык для 3 < _, который создает частично примененную функцию из вызова метода.

3 голосов
/ 06 июля 2011

ведет себя правильно:

scala> nums span (3 < _)
res4: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

Предикат ложен для первого элемента списка, поэтому первый список, возвращаемый span, пуст.

1 голос
/ 06 июля 2011
scala> nums span (3 < _) 
res0: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))
// is equivalent to 
scala> (nums takeWhile{3 < _}, nums.dropWhile{3 < _}) 
res1: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))

, где предикат является ложным уже для первого элемента (1), поэтому nums.takeWhile{false} приводит к пустому списку List()

Для второй части ничего не отбрасывается, поскольку предикат уже ложендля первого элемента (1) и, следовательно, nums.dropWhile{false} - это весь список List(1, 2, 3, 4, 5).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...