.net 合并2个序列

.net 合并2个序列,.net,functional-programming,f#,.net,Functional Programming,F#,我正在尝试重新创建自己的Seq.zip函数。 它需要做与Seq.zip完全相同的事情,但只使用Seq来创建它。以下是我目前的代码: let rec seqZip s1 s2 = seq { let e1 = Seq.item 0 s1 let e2 = Seq.item 0 s2 let rec helper s1 s2 n = match s1, s2 with | s1, s2 when

我正在尝试重新创建自己的Seq.zip函数。 它需要做与Seq.zip完全相同的事情,但只使用Seq来创建它。以下是我目前的代码:

let rec seqZip s1 s2 =
    seq {
        let e1 = Seq.item 0 s1
        let e2 = Seq.item 0 s2

        let rec helper s1 s2 n =
            match s1, s2 with
            | s1, s2 when n > s1.Length && n > s2.Length -> yield ()
            | s1, s2 -> yield (Seq.item (n+1) s1, Seq.item (n+1) s2)

        helper s1 s2 0
    } 

我甚至不确定我是否需要一个helper函数,但是你有什么建议吗?

类型声明
seq
。该接口提供了一个枚举器,我们可以用它遍历集合,所有更高级别的函数也将依赖于这些接口。因此,通过
MoveNext()
方法和
Current
属性迭代序列应该是最有效的方法

let zip (s1 : seq<_>) (s2 : seq<_>) =
    use e1 = s1.GetEnumerator()
    use e2 = s2.GetEnumerator()
    let rec loop () = seq{
        if e1.MoveNext() && e2.MoveNext() then
            yield e1.Current, e2.Current
            yield! loop() }
    loop()

zip [1..3] [11..14] |> Seq.toList
// val it : (int * int) list = [(1, 11); (2, 12); (3, 13)]
Seq.zip [1..3] [11..14] |> Seq.toList
// val it : (int * int) list = [(1, 11); (2, 12); (3, 13)]
let-zip(s1:seq)(s2:seq)=
使用e1=s1.GetEnumerator()
使用e2=s2.GetEnumerator()
让rec循环()=seq{
如果e1.MoveNext()和&e2.MoveNext()那么
产生e1.电流,e2.电流
yield!loop()}
循环()
zip[1..3][11..14]|>Seq.toList
//val it:(int*int)list=[(1,11);(2,12);(3,13)]
Seq.zip[1..3][11..14]|>Seq.toList
//val it:(int*int)list=[(1,11);(2,12);(3,13)]

嵌套的helper函数很好地封装了递归。

类型声明
seq
。该接口提供了一个枚举器,我们可以用它遍历集合,所有更高级别的函数也将依赖于这些接口。因此,通过
MoveNext()
方法和
Current
属性迭代序列应该是最有效的方法

let zip (s1 : seq<_>) (s2 : seq<_>) =
    use e1 = s1.GetEnumerator()
    use e2 = s2.GetEnumerator()
    let rec loop () = seq{
        if e1.MoveNext() && e2.MoveNext() then
            yield e1.Current, e2.Current
            yield! loop() }
    loop()

zip [1..3] [11..14] |> Seq.toList
// val it : (int * int) list = [(1, 11); (2, 12); (3, 13)]
Seq.zip [1..3] [11..14] |> Seq.toList
// val it : (int * int) list = [(1, 11); (2, 12); (3, 13)]
let-zip(s1:seq)(s2:seq)=
使用e1=s1.GetEnumerator()
使用e2=s2.GetEnumerator()
让rec循环()=seq{
如果e1.MoveNext()和&e2.MoveNext()那么
产生e1.电流,e2.电流
yield!loop()}
循环()
zip[1..3][11..14]|>Seq.toList
//val it:(int*int)list=[(1,11);(2,12);(3,13)]
Seq.zip[1..3][11..14]|>Seq.toList
//val it:(int*int)list=[(1,11);(2,12);(3,13)]

嵌套的helper函数很好地封装了递归。

更面向序列的解决方案是:

let rec seqzip (a: 'a seq) (b: 'b seq): ('a*'b) seq =
    match a with
    | empty when Seq.isEmpty empty -> Seq.empty<'a*'b>
    | aa ->
        match b with
        | empty when Seq.isEmpty empty -> Seq.empty<'a*'b>
        | bb -> seq{
            yield (Seq.head aa, Seq.head bb)
            yield! (seqzip (Seq.tail aa) (Seq.tail bb))
            }
let rec seqzip(a:'a seq)(b:'b seq):('a*'b)seq=
匹配
|当Seq.isEmpty为空时为空->Seq.empty
|aa->
匹配
|当Seq.isEmpty为空时为空->Seq.empty
|bb->seq{
收益率(序号aa、序号bb)
收益率!(seqzip(Seq.tail aa)(Seq.tail bb))
}

一个更面向顺序的解决方案是:

let rec seqzip (a: 'a seq) (b: 'b seq): ('a*'b) seq =
    match a with
    | empty when Seq.isEmpty empty -> Seq.empty<'a*'b>
    | aa ->
        match b with
        | empty when Seq.isEmpty empty -> Seq.empty<'a*'b>
        | bb -> seq{
            yield (Seq.head aa, Seq.head bb)
            yield! (seqzip (Seq.tail aa) (Seq.tail bb))
            }
let rec seqzip(a:'a seq)(b:'b seq):('a*'b)seq=
匹配
|当Seq.isEmpty为空时为空->Seq.empty
|aa->
匹配
|当Seq.isEmpty为空时为空->Seq.empty
|bb->seq{
收益率(序号aa、序号bb)
收益率!(seqzip(Seq.tail aa)(Seq.tail bb))
}