Generics F#使用通用度量单位创建通用函数

Generics F#使用通用度量单位创建通用函数,generics,f#,units-of-measurement,Generics,F#,Units Of Measurement,我觉得我可能在按照F#想要的方式思考度量的类型和单位,但我想问这个问题,以防我遗漏了一些明显的东西。我使用类型和度量单位来确保所有操作都具有类型对齐。我想定义一个通用的tryDivide函数,该函数将采用匹配的类型,但我正在兜圈子,试图让它工作。这里是一个非通用版本,可以工作: [<Measure>] type USD (* US Dollars *) let tryDivide a b = match b > 0M with | true -> a /

我觉得我可能在按照F#想要的方式思考度量的类型和单位,但我想问这个问题,以防我遗漏了一些明显的东西。我使用类型和度量单位来确保所有操作都具有类型对齐。我想定义一个通用的
tryDivide
函数,该函数将采用匹配的类型,但我正在兜圈子,试图让它工作。这里是一个非通用版本,可以工作:

[<Measure>] type USD (* US Dollars *)

let tryDivide a b =
    match b > 0M with
    | true -> a / b |> decimal |> Some
    | false -> None


type Cost = decimal<USD>

module Cost =
    let create v : Cost =
        v * 1M<USD>

    let tryDivide (a:Cost) (b:Cost) =
        tryDivide (decimal a) (decimal b)

let costA = Cost.create 10M
let costB = Cost.create 20M

let ratio = Cost.tryDivide costA costB

如果我的思维过程从根本上是错误的,我很想听到它。我为每种类型手工编写了一个
tryDivide
,这似乎效率低下。

我马上找到了答案。您需要将
b>0M
设置为通用单位。为此,您需要打开Microsoft.FSharp.Core.LanguagePrimitives模块并使用
DecimalWithMeasure
函数。以下是新版本的
tryDivide
功能:

let tryDivide a b =
    match b > (DecimalWithMeasure 0M) with
    | true -> a / b |> Some
    | false -> None
let tryDivide a b =
    match b > (DecimalWithMeasure 0M) with
    | true -> a / b |> Some
    | false -> None