使用 LanguagePrimitives 来保留或设置单位

当函数由于低级操作而不自动保留单元时,LanguagePrimitives 模块可用于设置支持它们的基元上的单位:

/// This cast preserves units, while changing the underlying type
let inline castDoubleToSingle (x : float<'u>) : float32<'u> =
    LanguagePrimitives.Float32WithMeasure (float32 x)

要将度量单位分配给双精度浮点值,只需用正确的单位乘以 1 即可:

[<Measure>]
type USD

let toMoneyImprecise (amount : float) =
   amount * 1.<USD>

要将度量单位分配给非 System.Double 的无单位值,例如,从以其他语言编写的库中到达,请使用转换:

open LanguagePrimitives

let toMoney amount =
   amount |> DecimalWithMeasure<'u>

以下是 F#interactive 报告的函数类型:

val toMoney : amount:decimal -> decimal<'u>
val toMoneyImprecise : amount:float -> float<USD>