Seq.iter 无法迭代使用 seq.collect 和序列表达式创建的序列
Seq.iter fails to iterate the sequence created with seq.collect and sequence expression
我在 F# 代码中遇到了一个错误,我已将其简化为以下最小再现序列,但现在我不明白为什么它会那样工作。
let duplicate element =
[ element; element ]
let passThrough (sq: seq<_>) =
use it = sq.GetEnumerator ()
seq {
while (it.MoveNext ()) do
yield it.Current
}
[<EntryPoint>]
let main _ =
[0; 1]
|> Seq.collect (duplicate)
(* |> Seq.toArray // When uncommented - works as expected. *)
|> passThrough
|> Seq.iter (fun i -> printf $"{i} ")
0
当 Seq.toArray
调用取消注释时,它会产生我期望的结果,即迭代序列管道并打印 0 0 1 1
。但是,注释掉该行后,代码就完成了,没有打印任何内容。
我与 F# Slack 的一位专家进行了讨论(感谢 R.C.),并被告知 passThrough
的正确实现应该如下所示。当 while 循环退出时,枚举器将被正确处理。原始实现的问题是枚举数是在 while
循环退出之前的某个时间点处理的,如果有的话。
let passThrough (sq: seq<_>) =
seq {
use it = sq.GetEnumerator ()
while (it.MoveNext ()) do
yield it.Current
}
我在 F# 代码中遇到了一个错误,我已将其简化为以下最小再现序列,但现在我不明白为什么它会那样工作。
let duplicate element =
[ element; element ]
let passThrough (sq: seq<_>) =
use it = sq.GetEnumerator ()
seq {
while (it.MoveNext ()) do
yield it.Current
}
[<EntryPoint>]
let main _ =
[0; 1]
|> Seq.collect (duplicate)
(* |> Seq.toArray // When uncommented - works as expected. *)
|> passThrough
|> Seq.iter (fun i -> printf $"{i} ")
0
当 Seq.toArray
调用取消注释时,它会产生我期望的结果,即迭代序列管道并打印 0 0 1 1
。但是,注释掉该行后,代码就完成了,没有打印任何内容。
我与 F# Slack 的一位专家进行了讨论(感谢 R.C.),并被告知 passThrough
的正确实现应该如下所示。当 while 循环退出时,枚举器将被正确处理。原始实现的问题是枚举数是在 while
循环退出之前的某个时间点处理的,如果有的话。
let passThrough (sq: seq<_>) =
seq {
use it = sq.GetEnumerator ()
while (it.MoveNext ()) do
yield it.Current
}