因此,如果您去银行,有一种设备可以从中提取号码。
我想写一个这样的函数。所以每次调用这个函数时,我们都会得到系列中的下一个数字。
所以如果这个函数第一次被调用,我们得到 1。第二次我们得到 2.... 依此类推。
这是我到目前为止所写的
let X =
let myseq = seq {1 .. 100}
let GetValue =
Seq.head (Seq.take 1 myseq)
GetValue;;
let p = X;;
p;;
p;;
p;;
但它总是返回 1。我希望因为序列是一个闭包,所以每次我做一次拍摄时,我都会得到下一个数字。
我也试过这个
let X =
let mutable i = 1
let GetValue =
i <- i + 1
i
GetValue;;
let p = X;;
p;;
p;;
p;;
这个只打印 2...
最佳答案
你必须返回一个函数。而对于它,你每次都必须传递一些东西,即你的 +1
必须推迟。
let factory =
let counter = ref 0
fun () ->
counter.Value <- !counter + 1
!counter
现在你得到
> factory();;
val it : int = 1
> factory();;
val it : int = 2
这样做有一个很好的副作用,即您将可变引用单元完全隐藏在函数内,因此无法以某种方式篡改您的计数器。
关于F#如何编写一个按顺序提供计数器编号的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18168798/