F#类持久计数器

时间:2018-01-05 10:34:17

标签: class f# counter

的世家,

旧时程序/确定性程序员与F#功能性斗争......

我需要一些计数器来记录程序各个方面的计数。 以下代码编译干净并且似乎可以正常工作但是" ctr"永远不会增加。

任何帮助表示赞赏,Ian

type Count() as this = 
    let mutable ctr = 0
    do
        printfn "Count:Constructor: %A" ctr
    member this.upctr : int = 
        let ctr  = ctr + 1 
        printfn "inCount.upctr %d" ctr
        ctr

let myCount = new Count()
printfn "MyCtr1 %d" (myCount.upctr)
let fred = myCount.upctr
let fred = myCount.upctr

2 个答案:

答案 0 :(得分:3)

ctr是可变的。使用:

ctr  <- ctr + 1  // this will mutate the value contained in ctr

而不是

// this will create a new binding which is not mutable
// and will shadow the original ctr
let ctr = ctr + 1  

另请注意告诉您在类型声明中不需要as this的警告。

答案 1 :(得分:3)

你也可以创建一个这样的线程安全计数器:

let counter() =
    let c = ref 0
    fun () ->
        System.Threading.Interlocked.Increment(c)

并使用

let countA = counter()
let countB = counter()
countA() |> printfn "%i" // 1
countA() |> printfn "%i" // 2
countB() |> printfn "%i" // 1

如果需要,将其包装在类型或模块中。