В Scala метод разбиения разбивает последовательность на две отдельные последовательности: те, для которых предикат является истинным, и те, для которых оно ложно:
scala> List(1, 5, 2, 4, 6, 3, 7, 9, 0, 8).partition(_ % 2 == 0)
res1: (List[Int], List[Int]) = (List(2, 4, 6, 0, 8),List(1, 5, 3, 7, 9))
Обратите внимание, что реализация Scala проходит только одну последовательность.
В Clojure функция partition-by
разбивает последовательность на несколько подпоследовательностей, каждое из которых является самым длинным подмножеством, которое либо выполняет, либо не соответствует предикату:
user=> (partition-by #(= 0 (rem % 2)) [1, 5, 2, 4, 6, 3, 7, 9, 0, 8])
((1 5) (2 4 6) (3 7 9) (0 8))
в то время как split-by
производит:
user=> (split-with #(= 0 (rem % 2)) [1, 5, 2, 4, 6, 3, 7, 9, 0, 8])
[() (1 5 2 4 6 3 7 9 0 8)]
Есть ли встроенная функция Clojure, которая выполняет ту же функцию, что и метод Scala partition
?