F# 问题与通用度量单位/匹配

F# 问题与通用度量单位/匹配,f#,F#,我已经阅读了很多关于度量单位的资源,包括好的Microsoft Doc和f,以获得乐趣和利润,但我仍然无法使我的代码正常工作 [<Measure>] type USD [<Measure>] type JPY [<Measure>] type EUR type FxUnit<[<Measure>] 'u,[<Measure>] 'v> = {UnitRate : float<'u/'v>} let getFx

我已经阅读了很多关于度量单位的资源,包括好的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>) =
没有多少成功。似乎有一个匹配,我不能返回一些不同计量单位的FxUnit类型

你知道我该怎么解决这个问题吗


谢谢。

问题在于您试图定义一个函数,该函数接受字符串并返回类型为FxUnit或FxUnit的值。一个函数不能有两种不同的返回类型,这是在运行时决定的

您可以让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

问题是您试图定义一个函数,该函数接受字符串并返回类型为FxUnit或FxUnit的值。一个函数不能有两种不同的返回类型,这是在运行时决定的

您可以让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

这似乎与类型参数的一般用法一致;例如,如果有一个函数返回'a list',则不能从一个分支返回浮点列表,从另一个分支返回int列表。如果您将函数getFx1声明为内联函数,那么它可能会起作用,因为编译器将使用静态解析的类型参数。度量单位的功能是让编译器验证您的算术逻辑是否正确,这样您就不会最终添加Yens+Euros。要实现这一点,您需要具有具有特定计量单位的值。如果它们是泛型的,那么编译器就不能再帮助你了,它们就失去了用处。因此,使用通用计量单位可以做的事情很少;例如,如果有一个函数返回'a list',则不能从一个分支返回浮点列表,从另一个分支返回int列表。如果您将函数getFx1声明为内联函数,那么它可能会起作用,因为编译器将使用静态解析的类型参数。度量单位的功能是让编译器验证您的算术逻辑是否正确,这样您就不会最终添加Yens+Euros。要实现这一点,您需要具有具有特定计量单位的值。如果它们是泛型的,那么编译器就不能再帮助你了,它们就失去了用处。因此,使用通用计量单位可以做的事情很少。