通用计量单位/匹配问题

时间:2018-11-20 11:05:32

标签: 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>}

这样,我在以下情况下收到错误消息:

1.0<USD/EUR>

我尝试过这些:

let getFx1  u : (float<'u>) =
let getFx1  u : (float<'u/'v>) =

没有太大的成功。似乎通过匹配,我无法返回具有不同UoM的某些FxUnit类型。

有什么想法我可以解决这个问题吗?

谢谢。

1 个答案:

答案 0 :(得分: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