F#:可以在运行时动态绑定度量单位吗?

时间:2010-11-10 00:45:24

标签: f# units-of-measurement

我对F#很新,并且对测量单位功能很感兴趣,并且大致了解它是如何正常工作的,但是想知道是否可以将测量值绑定到我们不知道什么的值度量将一直持续到代码执行?

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

我们假设每种货币(美元,欧元,澳元等)的衡量标准都是正常宣布的:

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

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

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

这是可能的,还是有另一种方法可以达到相同的结果?

2 个答案:

答案 0 :(得分:4)

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

您可以使用运行时实现创建一个库(我没有想过设计会是什么样子)。但是你可能会失去静态检查。

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

答案 1 :(得分:1)

除非您编写的代码实际上特定于某种特定货币,否则您不应在代码中明确提及USD,EUR,AUD等。相反,使您的代码对所涉及的货币/货币具有多态性。

您需要考虑的是您希望从计量单位获得什么样的安全性。例如(在一个非常简单的场景中)你将从数据库字段中读取,进行一些处理并写回同一个字段,然后具有类型float<'a> -> float<'a>的函数正是你想要的:你不要关心货币是什么,只要你收回你输入的货币。