F#如何编写一个按顺序提供计数器编号的函数

标签 f#

因此,如果您去银行,有一种设备可以从中提取号码。

我想写一个这样的函数。所以每次调用这个函数时,我们都会得到系列中的下一个数字。

所以如果这个函数第一次被调用,我们得到 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/

相关文章:

f# - 为多个数据文件创建类似的 HTML 报告

database - 从语言实现的角度来看,实现 F# 3.0 中的类型提供程序需要什么?

c# - F# 和 C# 的 CLR 相同那么为什么 F# 比 C# 快

F# 匹配 ->

f# - FsCheck如何生成元组

f# - F-Sharp (F#) 无类型无穷大

data-structures - 将 Haskell Edison API 和 Core 移植到 F# 有什么好处吗?

f# - Azure 和 F# 3.0 类型提供程序

linux - 在不使用 Mono 的情况下,.NET Core 上是否有适用于 Linux 的 F# Interactive?

.net - 通过反射创建F#记录