【发布时间】:2019-06-28 23:37:03
【问题描述】:
def span(p: (A) => Boolean): (Seq[A], Seq[A])
根据谓词将此可迭代集合拆分为前缀/后缀对。
注意:c span p 等价于(但可能比)(c takeWhile p, c dropWhile p),前提是谓词 p 的评估不会导致任何副作用。
注意:可能会针对不同的运行返回不同的结果,除非对底层集合类型进行了排序。
- p - 测试谓词
- 返回 - 由该可迭代集合的最长前缀(其元素都满足 p)和该可迭代集合的其余部分组成的一对。
- 定义类 - IterableOps → IterableOnceOps
- 注意 - 重用:调用此方法后,应丢弃调用它的迭代器,并仅使用返回的迭代器。使用旧迭代器是未定义的,可能会发生变化,并且也可能导致对新迭代器的更改。
在查看 Seq 的 F# documentation 时,我没有看到任何等价物。
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])
【问题讨论】:
-
FSharpx.Collections 库中的这个 span 函数似乎与列表等效:github.com/fsprojects/FSharpx.Collections/blob/master/src/… 请注意,它们对序列的实现仅使用 takeWhile 和 skipWhile,就像在您的列表示例中一样:@ 987654324@