代码之家  ›  专栏  ›  技术社区  ›  Sam

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

  •  4
  • Sam  · 技术社区  · 14 年前

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

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

    假设每种货币(美元、欧元、澳元等)的衡量标准通常是:

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

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

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Brian    14 年前

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

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

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

        2
  •  1
  •   Ganesh Sittampalam    14 年前

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