F# 具有度量约束的泛型类

F# 具有度量约束的泛型类,f#,generic-programming,F#,Generic Programming,如何在F#中创建一个泛型类,并将该类型约束为度量值 我已经尝试过,但a2和b2不会产生错误: open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames type Vector2D_A<[<Measure>] 'u>(x : float<'u>, y : float<'u>) = member this.X = x member this.Y = y type Vector2D_B&l

如何在F#中创建一个泛型类,并将该类型约束为度量值

我已经尝试过,但a2和b2不会产生错误:

open Microsoft.FSharp.Data.UnitSystems.SI.UnitNames

type Vector2D_A<[<Measure>] 'u>(x : float<'u>, y : float<'u>) =
    member this.X = x
    member this.Y = y

type Vector2D_B<'t, [<Measure>] 'u>(x : 't, y : 't) =
    member this.X = x
    member this.Y = y

type Vector2D_C<'t>(x : 't, y : 't) =
    member this.X = x
    member this.Y = y

let a1 = Vector2D_A(1.0<metre>, 2.0<metre>)
let b1 = Vector2D_A(1.0<metre>, 2.0<metre>)
let c1 = Vector2D_C(1.0<metre>, 2.0<metre>)

let a2 = Vector2D_A(1.0, 2.0) // should produce an error
let b2 = Vector2D_A(1.0, 2.0) // should produce an error
let c2 = Vector2D_C(1.0, 2.0)
打开Microsoft.FSharp.Data.UnitSystems.SI.UnitNames
输入Vector2D_A,y:float(x:t,y:t)=
请记住这个。X=X
成员:this.Y=Y
设a1=Vector2D_A(1.0,2.0)
设b1=Vector2D_A(1.0,2.0)
设c1=Vector2D_C(1.0,2.0)
设a2=Vector2D_A(1.0,2.0)//应产生一个错误
设b2=Vector2D_A(1.0,2.0)//应产生一个错误
设c2=Vector2D_C(1.0,2.0)
我想定义一个类似于这三个示例中任何一个的类(但它们不编译):

(一)


type Vector2D_B(x:'t(x:'t,y:'t写入't等同于写入't-其中表示无量纲值的度量单位,当没有明确提供其他度量单位时,隐式应用


因此,如果不显式提供度量单位,则无法强制编译器生成错误消息,因为这样做是隐式提供无量纲值的度量单位。

展开BillH中的示例

考虑乘法方法的简单情况:

let mult a b = a * b
这有一个签名(比如float)

现在,抛出编译器错误是不合理的。例如,特定调用只能在某个高阶函数的特定输入集上发生。因此,没有简单的方法来指定某种度量单位上的某些约束,而这些度量单位在某种程度上是通用的(尽管有些是可能的,例如平方根函数)

即使不为函数指定任何单元进行运行时测试也很困难,因为编译代码后会丢弃度量单位信息

type Vector2D_B<'t when 't :> 't<[<Measure>]>>(x : 't<'u>, y : 't<'u>) =
    member this.X = x
    member this.Y = y
type Vector2D_B<'t when 't :> 't<_>(x : 't<'u>, y : 't<'u>) =
    member this.X = x
    member this.Y = y
let mult a b = a * b
float<'a> -> float<'b> -> float<'a'b>
float<'a> -> float<1/'a> -> float<1>