有没有更惯用的方法来生成无限的 uint64 序列?

Is there a more idiomatic way to generate an infinite sequence of uint64?

let makeIdGenerator startvalue =
    let index : uint64 ref = ref startvalue
    fun () -> 
        let result = !index
        index := !index + 1UL
        result

我需要的是一个函数的生成器,其类型为 unit -> uint64,如上所示。

上面的代码有效,但使用了一个引用变量来记住生成器的状态。

尝试使用 Seq.initInfinite (fun i -> i) 中的无限序列是行不通的,因为该序列本身使用 uint32 作为其状态。

这里有人知道即使没有参考变量也能做到这一点的方法吗?也许通过递归和收益之类的方式?

提前致谢。

避免循环中可变状态的标准函数式编程方法是在参数中传递它。

如果您想要一个无限序列,您可以使用序列表达式,其中 yield 用于 "first" 结果,yield! 用于递归调用:

let genUint64() =
    let rec genFrom n =
        seq {
            yield n
            yield! genFrom (n+1UL)
        }
    genFrom 0UL

您可以使用 Seq.unfold:

let makeIdGenerator (startvalue : uint64) =
  Seq.unfold (fun i -> Some((i, i+1UL))) startvalue