Как определить элемент расширения в единице измерения F #? - PullRequest
9 голосов
/ 23 августа 2011

Не говоря уже о том, должны ли мы использовать единицы измерения для безнитарных понятий, таких как углы, предположим, что я определил degree и radian единицы в F #

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 # или эта функция поддерживается?

1 Ответ

5 голосов
/ 23 августа 2011

Элементы расширения 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()

Однако я не понимаю, как это поможет вам в вашем случае ...

...