Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 将项的序列分块(或分割)为N个项的序列_F# - Fatal编程技术网

F# 将项的序列分块(或分割)为N个项的序列

F# 将项的序列分块(或分割)为N个项的序列,f#,F#,如何实现F#序列的分块(或分区)功能?我正在寻找一个具有此签名的函数 val toChunks : n:int -> sequence:seq<'T> -> seq<seq<'T>> 内森·埃文斯建议: ///返回产生长度为n的块的序列。 让我们来看看下面的例子 对于s中的x 缓冲区。[!pos]Array.copy 位置:=0 其他的 增量位置 如果!pos>0,则 产生数组.sub缓冲区0!位置 } 对我来说,这似乎是最好的方法,但我对其他

如何实现F#序列的分块(或分区)功能?我正在寻找一个具有此签名的函数

val toChunks : n:int -> sequence:seq<'T> -> seq<seq<'T>>

内森·埃文斯建议:

///返回产生长度为n的块的序列。
让我们来看看下面的例子
对于s中的x
缓冲区。[!pos]Array.copy
位置:=0
其他的
增量位置
如果!pos>0,则
产生数组.sub缓冲区0!位置
}

对我来说,这似乎是最好的方法,但我对其他解决方案感兴趣。

很高兴能提供帮助:)你说得对。。。我的搜索词找不到类似的问题。
[1; 2; 3; 4; 5; 6; 7; 8; 9]
|> toChunks 4
|> Seq.iter (printfn "%A")

seq [1; 2; 3; 4]
seq [5; 6; 7; 8]
seq [9]
/// Returns a sequence that yields chunks of length n.
let toChunks n (s:seq<'t>) = seq {
    let pos = ref 0
    let buffer = Array.zeroCreate<'t> n

    for x in s do
        buffer.[!pos] <- x
        if !pos = n - 1 then
            yield buffer |> Array.copy
            pos := 0
        else
            incr pos

    if !pos > 0 then
        yield Array.sub buffer 0 !pos
}