有没有更惯用的方法来生成无限的 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
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