F#修改&;返回
除了非常冗长之外,F#修改&;返回,f#,immutability,F#,Immutability,除了非常冗长之外,-函数的“修改后复制”功能完全是非泛型的:尽管我每次都在做同样的事情(将修改后的内容复制到同一个变量),但我必须重新编写整个过程,这不是很好 有一件事我觉得很烦人,那就是突变非常简单: type HTMLTag(s, Classes, Kids, Styles) = inherit Tag(Kids) member this.NominalTag = s member this.Classes = Classes member this.St
-
函数的“修改后复制”功能完全是非泛型的:尽管我每次都在做同样的事情(将修改后的内容复制到同一个变量),但我必须重新编写整个过程,这不是很好
有一件事我觉得很烦人,那就是突变非常简单:
type HTMLTag(s, Classes, Kids, Styles) =
inherit Tag(Kids)
member this.NominalTag = s
member this.Classes = Classes
member this.Styles: list<String * String> = Styles
static member (-) (this: HTMLTag, that: list<obj>) =
HTMLTag(this.NominalTag, this.Classes, that::this.Kids, this.Styles)
静态成员(-)(this:Tag,that:list)=
这个。孩子们=那个::这个。孩子们
这
但我正在尽可能地保持一切不变就是为了处理这个确切的情况。如果可以使用记录类型,则可以
static member (-) (this: Tag, that: list<obj>) =
this.Kids = that :: this.Kids
this
类型标记=
{NominalTag:obj
类别:obj
孩子们:名单
样式:列表}
静态成员(-)(this:Tag,that:list)=
{带孩子的这个=这个。孩子@那个}
此代码和您的代码的编译形式实际上是相同的
顺便说一句,(-
操作符被用来追加…这很奇怪,但我认为这是一个人为的情况
更新
既然你已经更新了你的问题,我对你想做什么感到困惑。如果你想返回一个新的对象,我不知道变异如何帮助你
一种功能性更强的方法(相对于继承)是将数据和行为分开,数据是记录,行为功能分组在一个模块中。如果您希望在类型之间共享行为,请使用接口。记录可以实现接口。就是用来处理这种情况的。如果可以使用记录类型,则可以
static member (-) (this: Tag, that: list<obj>) =
this.Kids = that :: this.Kids
this
类型标记=
{NominalTag:obj
类别:obj
孩子们:名单
样式:列表}
静态成员(-)(this:Tag,that:list)=
{带孩子的这个=这个。孩子@那个}
此代码和您的代码的编译形式实际上是相同的
顺便说一句,(-
操作符被用来追加…这很奇怪,但我认为这是一个人为的情况
更新
既然你已经更新了你的问题,我对你想做什么感到困惑。如果你想返回一个新的对象,我不知道变异如何帮助你
一种功能性更强的方法(相对于继承)是将数据和行为分开,数据是记录,行为功能分组在一个模块中。如果您希望在类型之间共享行为,请使用接口。记录可以实现接口。请参见:)请参见:)记录没有继承性,是吗?我的
标签
类层次结构有一些通过继承共享的常规数据/功能;有什么方法可以使用记录实现类似的效果吗?变异很有帮助,因为我只需执行clone()
即可获得一个新对象,更改一个字段并返回它以获得我想要的效果(复制和更新)。目前,我转而使用记录,这在本例中是有效的,但我可以想象,在更复杂的类层次结构中,在类层次结构中存在大量共享行为时,会出现问题;即使是接口也不能解决重复功能的问题。或者我只是没有忘记将对象的行为置于对象之外(如您所述)=记录没有继承性,是吗?我的标签
类层次结构有一些通过继承共享的常规数据/功能;有什么方法可以使用记录实现类似的效果吗?变异很有帮助,因为我只需执行clone()
即可获得一个新对象,更改一个字段并返回它以获得我想要的效果(复制和更新)。目前,我转而使用记录,这在本例中是有效的,但我可以想象,在更复杂的类层次结构中,在类层次结构中存在大量共享行为时,会出现问题;即使是接口也不能解决重复功能的问题。或者我只是没有忘记将对象的行为置于对象之外(如您所述)=)
type Tag =
{ NominalTag : obj
Classes : obj
Kids : list<obj>
Styles : list<String * String> }
static member (-) (this: Tag, that: list<obj>) =
{ this with Kids = this.Kids @ that }