Цитировать Документация Scala :
def span(p: (A) => Boolean): (Seq[A], Seq[A])
Разбивает эту итеративную коллекцию на пару префикс / суффикс в соответствии с предикатом.
Примечание: c span p эквивалентен (но, возможно, более эффективен, чем) (c takeWhile p, c dropWhile p), при условии, что оценка предиката p не вызывает никаких побочных эффектов.
Примечание: может возвращать разные результаты для разных прогонов, если только не упорядочен базовый тип коллекции.
- p - тестовый предикат
- return - пара, состоящая из самого длинного префикса этой итерируемой коллекции, все элементы которой удовлетворяют p, и остальная часть этой итерируемой коллекции.
- Определение классов - IterableOps → IterableOnceOps
- Примечание. Повторное использование: после вызова этого метода следует отказаться от итератора, для которого он был вызван, и использовать только те итераторы, которые были возвращены. Использование старого итератора не определено, может изменяться и может также привести к изменениям в новых итераторах.
При просмотре F # документации для Seq, я не вижу эквивалента.
groupBy, partition, splitAt, ни один из них не соответствует тому, что я пытаюсь сделать. Это похоже на одновременное выполнение takeWhile и skipWhile, но вместо двух итераций вам нужна только одна, где функция будет возвращать кортеж (takeWhile, skipWhile).
Выход должен соответствовать следующей функции
module List
let span (predicate: 'a -> bool) (list: 'a list): ('a list * 'a list) =
(list |> List.takeWhile predicate, list |> List.skipWhile predicate)
Но нужна только одна итерация, поскольку моя последовательность может быть бесконечной.
[1;2;3;4] |> List.span (fun i -> i % 2 = 1) => ([1], [2;3;4])