F#:度量单位能否在运行时动态绑定?

F#:度量单位能否在运行时动态绑定?,f#,units-of-measurement,F#,Units Of Measurement,我对F#非常陌生,对度量单位功能很感兴趣,对它的正常工作方式有一个大致的了解,但我想知道是否可以将度量值绑定到在代码执行之前我们不知道度量值是什么的值 我所看到的实际示例是将浮动绑定为货币值,其中度量单位是从数据库查找中推断出来的 让我们假设每种货币(美元、欧元、澳元等)的衡量标准都是正常宣布的: [<Measure>] USD [<Measure>] EUR [<Measure>] AUD ... []美元 []欧元 []澳元 ... 首先,您需要一种从标识符获取度量值类

我对F#非常陌生,对度量单位功能很感兴趣,对它的正常工作方式有一个大致的了解,但我想知道是否可以将度量值绑定到在代码执行之前我们不知道度量值是什么的值

我所看到的实际示例是将浮动绑定为货币值,其中度量单位是从数据库查找中推断出来的

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

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

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


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

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

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


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

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


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

这是有道理的——我猜这是因为没有IL支持度量单位。我已经在C#中找到了一个解决方案,可以移植到F#,只是想知道是否有一种更“新颖”的方法。谢谢这正是我在度量单位上看到的第一个限制,使我一开始就没有使用它们。事实上,这种情况应该是一些通用的度量,比如currency你最终使用了计量单位吗?