gpt4 book ai didi

f# - F# 对象表达式中的可变状态

转载 作者:行者123 更新时间:2023-12-02 07:08:35 24 4
gpt4 key购买 nike

我想在 F# 对象表达式中有一个可变状态。第一种方法是使用 ref 单元格,如下所示:

type PP =
abstract member A : int

let foo =
let a = ref 0
{ new PP with
member x.A =
let ret = !a
a := !a + 1
ret
}

printfn "%A" foo.A
printfn "%A" foo.A
printfn "%A" foo.A
printfn "%A" foo.A

另一种方法如下:

type State(s : int) =
let mutable intState = s
member x.state
with get () = intState
and set v = intState <- v

[<AbstractClass>]
type PPP(state : State) =
abstract member A : int
member x.state
with get () = state.state
and set v = state.state <- v

let bar n =
{ new PPP(State(n)) with
member x.A =
let ret = x.state
x.state <- ret + 1
ret
}

let barA1 = bar 0
printfn "%A" barA1.A
printfn "%A" barA1.A
printfn "%A" barA1.A
printfn "%A" barA1.A

哪个版本可能性能更好(我需要状态更新 x.state <- ret + 1在性能关键部分)?我的猜测是 State 对象也是在堆上分配的,所以没有理由说第二个版本应该更快。然而,它使用起来稍微更有吸引力。

感谢您的任何反馈和建议

最佳答案

正如大牛所说,最后一种方法本质上等同于使用内置的ref

当使用 ref 时,您分配了两个对象 - 您要返回的对象和引用单元格本身。您可以通过使用具体实现将其减少为仅分配一个对象(但我认为这在实践中并不重要):

type Stateful(initial:int) = 
let mutable state = initial
interface PP with
member x.A =
let ret = state
state <- state + 1
ret

let foo =
Statefull(0) :> PP // Creates a single object that keeps the state as mutable field

此外,您正在使用只读属性修改对象的内部状态并每次返回一个新状态。这是一种危险的模式,可能会让人非常困惑 - 具有 getter 的属性不应修改状态,因此您可能应该改用方法 (unit -> int)。

关于f# - F# 对象表达式中的可变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8170670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com