如何在迭代器上循环?

3
在Rust中,您可以对迭代器进行循环。例如:
fn main() {
    for i in (1..4).cycle().take(5) {
        print!("{} ", i);
    }
}

输出:

1 2 3 1 2 

如何在F#中执行同样的操作?

[<EntryPoint>]
let main argv =
    seq { 1 .. 4 } |> (* Something *) |> Seq.take 5 |> Seq.iter (printf "%d ")
    0
1个回答

7

我不知道有任何内置的函数,但你可以很容易地创建自己的函数:

let cycle items = seq {
    while true do
        yield! items
}

或者

let cycle' items =
    Seq.initInfinite (fun _ -> items) |> Seq.concat

或者

let rec cycle'' items = seq {
    yield! items
    yield! cycle'' items
}

那么

// 1 2 3 1 2
seq { 1 .. 3 } |> cycle |> Seq.take 5 |> Seq.iter (printf "%d ")

1
很奇怪,没有内置函数。也许可以请求在dotnet core中添加它。这个函数在Haskell中也存在http://hackage.haskell.org/package/base-4.10.1.0/docs/Data-List.html#v:cycle,看起来相当普遍。 - Boiethios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接