的世家,
旧时程序/确定性程序员与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
答案 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
如果需要,将其包装在类型或模块中。