抛开我们是否应该对无单位概念(例如角度)使用度量单位,假设我在F#中定义了degreeradian单位

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/

10-11 02:59
查看更多