Inheritance 创建具有常量值的F#记录类型

Inheritance 创建具有常量值的F#记录类型,inheritance,f#,recordtype,Inheritance,F#,Recordtype,假设我有一个记录被如此定义 type Employee = {Name : string; Salary : int} 我想要另一种类型,其中工资是固定的。我想说 type Manager = {Name: string; Salary : int = 250000} ……但我似乎不能 要获得这种行为,我必须具备哪些选项?F#记录是不可变的,因此用您的话说,所有字段值都是“固定”的 如果您的目标是避免在构建时指定工资,最简单的方法是创建一个“构造函数”: 注1。我使用了Manager.Nam

假设我有一个记录被如此定义

type Employee = {Name : string; Salary : int}
我想要另一种类型,其中
工资
是固定的。我想说

type Manager = {Name: string; Salary : int = 250000}
……但我似乎不能

要获得这种行为,我必须具备哪些选项?

F#记录是不可变的,因此用您的话说,所有字段值都是“固定”的

如果您的目标是避免在构建时指定
工资
,最简单的方法是创建一个“构造函数”:

注1。我使用了
Manager.Name
,这样它就不会干扰
员工的构建
附注2。此外,这种方法甚至不会阻止保留一个类型的
员工
,这也将优雅地处理经理的创建;只需调用该方法,例如
MakeManager
,以明确说明问题


静态
方法并不禁止某人(使用您的库的开发人员)手动创建工资不正确的
经理
。有关如何防止此类创建的信息,请参阅。

记录类型可以有成员,例如

  type Employee = {Name : string; Salary : int}
  type Manager =
    {Name: string; }
    member x.Salary with get() = 250000
  let manager1 = {Manager.Name = "manager1"}
  let manager2 = { manager1 with Manager.Name = "manager2"}
  let salary = manager1.Salary // fsi: val salary : int = 250000

但在这里,如果经理是雇员,我会使用普通类和继承而不是记录。使用F#中的普通类是很好的,避免使用公共setter可以实现不变性。

您可以为记录提供一个只读属性:

type Manager = 
    {
        Name: string
    }
     member this.Salary = 250000
FSI示例:

> let m = { Name = "Foo" };;

val m : Manager = {Name = "Foo";}

> m.Name;;
val it : string = "Foo"
> m.Salary;;
val it : int = 250000

答对 了我要这个,希曼先生。顺便说一句,你在Pluralsight上的TDD F#课程做得很棒。刚刚看完。是不是第一个代码示例缺少了一个带有
?或者写这篇文章时不需要带
?当我今天尝试它时,如果没有
@RyanLundy的
,它是不会接受的。我刚刚从F#脚本文件以及F#Interactive中尝试过,上面的语法在这两种情况下都对我有效…@MarkSeemann好的,我知道发生了什么…有多奇怪。我在
=
后面有一个大括号。这样做需要使用
,但使用大括号和上面的大括号完全一样,这不是必需的。
> let m = { Name = "Foo" };;

val m : Manager = {Name = "Foo";}

> m.Name;;
val it : string = "Foo"
> m.Salary;;
val it : int = 250000