抛开我们是否应该对无单位概念(例如角度)使用度量单位,假设我在F#中定义了degree
和radian
单位
type [<Measure>] degree =
static member ToRadians (d:float<degree>) : float<radian> = d * (Math.PI * 1.<radian>) / 180.0<degree>
and [<Measure>] radian =
static member ToDegrees (r:float<radian>) : float<degree> = r * 180.0<degree> / (Math.PI * 1.<radian>)
我可以相对容易地使用它们,例如
4.0<degree> |> degree.ToRadians
似乎扩展成员会更方便。所以我可以说
let d = 4.0<degree>
let r = d.ToRadians()
但是我不能以明显的方式定义扩展成员
type float<degree> with
member degrees.ToRadians() = degree.ToRadians(degrees)
...这给我以下错误
error FS0010: Unexpected identifier in type name. Expected infix operator, quote symbol or other token.
对于F#中的度量单位,扩展成员是否有语法上的窍门,或者是否支持该功能?
最佳答案
F#扩展成员与C#扩展成员的不同之处在于,您无法定义构造的泛型类型的扩展。例如,您可以在seq<'t>
上定义扩展名,但不能在seq<int>
上定义扩展名。换句话说,扩展成员实际上就像该类型的成员一样,而不是静态方法。这也适用于度量类型,因此您不能在float<degree>
上定义扩展名,但是可以在float<[<Measure>]'u>
上定义扩展名:
type float<[<Measure>]'u> with
member f.Squared() = f * f
[<Measure>]
type m
let area = 2.0<m>.Squared()
但是,我看不出这对您的情况有什么帮助。
关于f# - 如何在F#度量单位上定义扩展成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7153930/