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 }