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