В 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
?