Краткая нотация для одиночной анонимной функции arg (без подчеркивания) не работает должным образом
Пройдя несколько примеров в Интернете, я понимаю, что есть способ написать анонимную функцию без подчеркивания, когда только один аргумент. Кроме того, я экспериментирую с методом "span" в List, который я никогда не знал. Во всяком случае, вот мой сеанс 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))
Почему это ведет себя по-другому?
Ответы
Ответ 1
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 < _
, которое создает частично применимую функцию из вызова метода.
Ответ 2
Правильное поведение:
scala> nums span (3 < _)
res4: (List[Int], List[Int]) = (List(),List(1, 2, 3, 4, 5))
Предикат является ложным для первого элемента списка, поэтому первый список, возвращаемый span
, пуст.
Ответ 3
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)
.