在F#中拆分seq

Tom*_*Tom 8 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}
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 10

您所做的只是分组 - 每次遇到值时都会创建一个新组.

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)
Run Code Online (Sandbox Code Playgroud)

let items = seq [1;2;3;4;1;5;6;7;1;9]
items |> splitBy ((=) 1)
Run Code Online (Sandbox Code Playgroud)

同样,更短,斯蒂芬的改进很好:

let splitBy f input =
  let i = ref 0
  input
  |> Seq.groupBy (fun x ->
    if f x then incr i
    !i)
  |> Seq.map snd
Run Code Online (Sandbox Code Playgroud)

  • +1,非常整洁!如果您正处于可能难以解密但令人满意的简洁功能组合中,您可以使用以下作为`splitBy`的最后一行:`|> Seq.map(snd >> Seq.map snd )` (2认同)