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
作为其状态。
即使没有参考变量,有没有人知道这样做的方法?也许通过递归和收益等等?
提前致谢。
答案 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