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

时间:2015-04-14 16:20:26

标签: f#

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作为其状态。

即使没有参考变量,有没有人知道这样做的方法?也许通过递归和收益等等?

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

如果你想要一个无限序列,你可以使用序列表达式yield表示“第一个”结果,yield!表示递归调用:

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

答案 1 :(得分:5)

您可以使用Seq.unfold

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