Разделение Clojure с помощью фильтра

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

13
задан Ralph 14 April 2011 в 16:25
поделиться