4

我对 F# 非常陌生,对度量单位功能很感兴趣,并且对它的正常工作方式有一个粗略的了解,但想知道是否可以将度量值绑定到我们不知道度量值的值直到代码执行?

我正在查看的实际示例是将浮点数绑定为货币值,其中计量单位是从数据库查找中推断出来的。

让我们假设每种货币(美元、欧元、澳元等)的度量标准都是正常声明的:

[<Measure>] USD
[<Measure>] EUR
[<Measure>] AUD
...

首先,您需要一种从标识符获取度量类型的方法,理想情况下,度量名称本身作为货币代码最有可能作为 3 个字符的字符串存储和检索(类似于Enum.Parse())。

然后,您需要一种将浮点值绑定到上一步中创建的类型的方法。

这是可能的,还是有其他方法可以达到相同的结果?

4

2 回答 2

4

这是不可能的,因为 F# 度量单位已被删除(它们仅在编译时存在)。

您可以编写一个具有运行时实现的库(我没有想过设计会是什么样子)。但是您可能会丢失静态检查。

我认为更好的策略可能是隔离边界,并在边界点(您从数据库中读取并推断单元类型)以某种方式将正确的类型放入类型系统,但这取决于代码的结构和你到底在做什么,这可能或不可能/容易...

于 2010-11-10T00:49:10.837 回答
1

除非您正在编写实际上特定于一种特定货币的代码,否则您不应在代码中明确提及美元、欧元、澳元等。相反,使您的代码在所涉及的货币/货币上具有多态性。

您必须考虑的是您期望从度量单位中获得什么样的安全性。例如,如果(在一个非常简单的场景中)您将从数据库字段中读取,进行一些处理并写回同一字段,那么拥有类型的函数float<'a> -> float<'a>正是您想要的:您不在乎货币是什么就是,只要你拿回你放进去的那个。

于 2010-11-10T07:55:37.833 回答