Fre*_*sen 1 .net f# functional-programming
我正在尝试重新创建自己的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
}
Run Code Online (Sandbox Code Playgroud)
我不确定那里是否需要辅助功能,但是您有什么建议吗?
类型声明seq<'a>是的类型别名System.Collections.Generic.IEnumerable<'a>。该接口提供了一个枚举器,我们可以使用它遍历集合,所有更高级别的函数也将依赖于这些接口。因此,通过该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)]
Run Code Online (Sandbox Code Playgroud)
嵌套的辅助函数很好地封装了递归。
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |