【问题标题】:Can F# update immutable bindings in a class (create a new object with the specified bindings changed?)F# 可以更新类中的不可变绑定(创建一个更改了指定绑定的新对象吗?)
【发布时间】:2015-04-09 09:43:43
【问题描述】:

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

基本上,语法{&lt; &gt;} 允许我们在某种意义上更新不可变属性,方法是创建一个新对象,其中除了指定的条目已更改之外,所有相同的条目都已更改。 F#中有类似的操作吗?

【问题讨论】:

  • 这里有 复制和更新记录表达式,我想这与记录类似,请参阅here 了解更多信息。

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


【解决方案1】:

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

使用记录/函数

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;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多