f# - 在F#中分割seq

标签 f# split seq

我应该通过元素的属性将seq<a>拆分为seq<seq<a>>。如果此属性等于给定值,则必须在该点“拆分”。如何在 FSharp中做到这一点?

如果必须在该项目处拆分或不拆分,则将一个“函数”传递给它返回 bool 值应该很好。

样本:
输入序列:seq: {1,2,3,4,1,5,6,7,1,9}当它等于1时,应该在每个项目上拆分它,因此结果应该是:

seq
{
seq{1,2,3,4}
seq{1,5,6,7}
seq{1,9}
}

最佳答案

您真正要做的就是分组-每次遇到值时创建一个新组。

let splitBy f input =
  let i = ref 0
  input 
  |> Seq.map  (fun x -> 
    if f x then incr i
    !i, x)
  |> Seq.groupBy fst
  |> Seq.map (fun (_, b) -> Seq.map snd b)

例子
let items = seq [1;2;3;4;1;5;6;7;1;9]
items |> splitBy ((=) 1)

再次简短地说,有了Stephen的出色改进:
let splitBy f input =
  let i = ref 0
  input
  |> Seq.groupBy (fun x ->
    if f x then incr i
    !i)
  |> Seq.map snd

关于f# - 在F#中分割seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6736464/

相关文章:

unit-testing - 对F#中的高阶函数进行单元测试

.net - 非常简单的 F# 表单锁定键盘输入

java - 使用 split 解析分隔文本文件

clojure - clojure a 与非标准迭代 java API 的互操作

clojure - Clojure中Seq函数的使用

r - 查找没有任何包的基因组组合

r - 如何在 R 中实现 F# 的正向管道运算符?

events - 如何弱订阅事件/可观察量

regex - 如何使用正则表达式使用前缀字符进行拆分?

python - 将 CSV 文件分割成相等的部分?