带有私有构造函数的F#结构声明

带有私有构造函数的F#结构声明,f#,F#,假设我们有一个AngularSpeed类,它包含角度、速度和时间(速度=角度/时间)。显然,一次设置所有三个值是不明确的。因此,我们使用私有构造函数和静态函数从(速度、时间)或(角度、时间)创建角度速度 我认为使用[]和主构造函数的定义通常是首选的(至少对我来说,它看起来更好!),但我相信下面使用结构的定义。。结束相当于您正在做的事情: type AngularSpeed = struct val mutable angle : float val mutable speed : flo

假设我们有一个AngularSpeed类,它包含角度、速度和时间(速度=角度/时间)。显然,一次设置所有三个值是不明确的。因此,我们使用私有构造函数和静态函数从(速度、时间)或(角度、时间)创建角度速度


我认为使用
[]
和主构造函数的定义通常是首选的(至少对我来说,它看起来更好!),但我相信下面使用
结构的定义。。结束
相当于您正在做的事情:

type AngularSpeed = struct
  val mutable angle : float
  val mutable speed : float
  val mutable time : float
  private new (angle: float, speed: float, time: float) =
    { angle = angle; time = time; speed = speed }
  static member FromAngleTime(angle, time) = AngularSpeed(angle, angle/time, time)
  static member FromSpeedTime(speed, time) = AngularSpeed(time*speed, speed, time)
end

我想最棘手的事情是构造函数体的语法——F#使用类似于记录的语法来初始化字段,而不是使用变异来赋值。

我看不到使用了太多的
struct…end
语法,但直接重新格式化看起来是这样的(这种类型的名称很奇怪,见下文):

请注意,无论语法如何,像这样的任何结构都将有一个空构造函数,它将所有值设置为
Unchecked.defaultof

方法变量 这种结构冗余存储数据;angle可能是一名成员。而且,你使用的是物理单位;您可能需要使用度量单位。照目前的情况,我不明白这种类型是什么。我不希望角速度包含时间或角度,而是
浮点
,或者
浮点
,如果您更喜欢以度为单位的角度。也许这种类型应该称为
RotationProcess
或类似的东西

/// Time in seconds. Abbreviation for the Microsoft standardized type.
[<Measure>] type s = Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols.s

type RotationProcess =
    struct
        val Speed : float</s>
        val Time : float<s>
    end

    member rp.Angle = rp.Speed * rp.Time
    private new (s, t) = { Speed = s; Time = t }
    static member FromAngleTime(a, t) = RotationProcess(a/t, t)
    static member FromSpeedTime(v, t) = RotationProcess(v, t)
    static member FromAngleSpeed(a, v) = RotationProcess(v, a/v)
///以秒为单位的时间。Microsoft标准化类型的缩写。
[]类型s=Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols.s
类型旋转过程=
结构
速度:浮动
val时间:浮动
结束
构件反向角度=反向速度*反向时间
私有新(s,t)={Speed=s;Time=t}
静态成员FromAngleTime(a,t)=旋转过程(a/t,t)
静态成员FromSpeedTime(v,t)=旋转过程(v,t)
静态构件从角度速度(a,v)=旋转过程(v,a/v)
type AngularSpeed = struct
  val mutable angle : float
  val mutable speed : float
  val mutable time : float
  private new (angle: float, speed: float, time: float) =
    { angle = angle; time = time; speed = speed }
  static member FromAngleTime(angle, time) = AngularSpeed(angle, angle/time, time)
  static member FromSpeedTime(speed, time) = AngularSpeed(time*speed, speed, time)
end
type AngularSpeed =
    struct
        val Angle : float
        val Speed : float
        val Time : float
    end

    private new (angle, speed, time) =
        { Angle = angle; Speed = speed; Time = time }

    static member FromAngleTime(a, t) = AngularSpeed(a, a/t, t)
    static member FromSpeedTime(s, t) = AngularSpeed(s*t, s, t)
/// Time in seconds. Abbreviation for the Microsoft standardized type.
[<Measure>] type s = Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols.s

type RotationProcess =
    struct
        val Speed : float</s>
        val Time : float<s>
    end

    member rp.Angle = rp.Speed * rp.Time
    private new (s, t) = { Speed = s; Time = t }
    static member FromAngleTime(a, t) = RotationProcess(a/t, t)
    static member FromSpeedTime(v, t) = RotationProcess(v, t)
    static member FromAngleSpeed(a, v) = RotationProcess(v, a/v)