F#可以更新类中的不可变绑定(创建一个指定绑定更改的新对象吗?)

时间:2015-04-09 09:43:44

标签: .net f# ocaml f#-3.0

有没有办法让F#更新类中的不可变绑定?或者,更具体地说,有没有办法复制类定义并更改单个不可变条目?例如,在OCaml中,我们可以编写诸如

之类的代码
let foo = object
  val fuz = 1
  method get_fuz = fuz
  method inc_fuz = {< fuz = fuz+1 >}
end

let _ = foo#get_fuz
let foo = foo#inc_fuz
let _ = foo#get_fuz

该程序产生

val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 1
val foo : < get_fuz : int; inc_fuz : 'a > as 'a = <obj>
- : int = 2

基本上,语法{< >}允许我们在某种意义上通过创建一个具有所有相同条目的新对象来更新不可变属性,除了指定的条目已更改。在F#中是否有类似的操作?

1 个答案:

答案 0 :(得分:3)

在这种情况下,基督徒是对的,你通常会这样做:

使用记录/功能

type foo = { fuz : int }

let inc_fuz f = { f with fuz = f.fuz + 1 }

试验:

> inc_fuz { fuz = 5 }
val it : foo = {fuz = 6;}

使用包含成员的记录

如果必须是会员:

type foo = 
    { fuz : int } 
    member f.inc_fuz = { f with fuz = f.fuz + 1 }

试验:

> let test = { fuz = 5 };;
val test : foo = {fuz = 5;}

> test.inc_fuz;;
val it : foo = {fuz = 6;}