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