通用计量单位/匹配问题

Jef*_*_hk 1 f#

我已经阅读了很多关于计量单位的资源(包括好的Microsoft Doc和f#以获得乐趣和利润)但我仍然无法使我的代码工作.

[<Measure>] type USD
[<Measure>] type JPY
[<Measure>] type EUR

type FxUnit<[<Measure>] 'u,[<Measure>] 'v> = {UnitRate : float<'u/'v>}

let getFx1 u  =
    match u with
    | "USD" -> {UnitRate = 1.0<USD/USD>}
    | "EUR" -> {UnitRate = 1.0<USD/EUR>}
Run Code Online (Sandbox Code Playgroud)

这样我就得到一个错误:

1.0<USD/EUR>
Run Code Online (Sandbox Code Playgroud)

我试过了:

let getFx1  u : (float<'u>) =
let getFx1  u : (float<'u/'v>) =
Run Code Online (Sandbox Code Playgroud)

没有太大的成功.似乎与匹配,我不能返回一些类型FxUnit与不同的UoM.

知道如何解决这个问题吗?

谢谢.

mar*_*lam 9

问题是你正在尝试定义一个函数,它接受一个字符串并返回一个FxUnit<USD,USD>或者类型的值FxUnit<USD,EUR>.函数不能有两种不同的返回类型,在运行时决定.

您可以使FxUnit采用区分联合的两个值而不是度量:

type Currency =
    | USD
    | JPY
    | EUR

type FxUnit = { UnitRate : float; From : Currency; To : Currency }

let getFx1 u  =
    match u with
    | "USD" -> {UnitRate = 1.0; From = USD; To = USD}
    | "EUR" -> {UnitRate = 1.0; From = USD; To = EUR}
    | _     -> failwithf "Unrecognised units %s" u
Run Code Online (Sandbox Code Playgroud)