2010-11-10 103 views
4

我对F#非常陌生,对Measure of Functions功能很感兴趣,对它是如何正常工作有一个大概的想法,但想知道是否可以将度量绑定到我们不知道措施将是直到代码执行?F#:可以在运行时动态绑定度量单位吗?

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

让我们假设每种货币措施(美元,欧元,澳元等),通常宣称:

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

首先,你需要一种方法来从标识符获得的测量的类型,最好的措施因为货币代码最有可能以3个字符的字符串存储和检索(类似于Enum.Parse())。

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

这是可能的,还是有另一种方法来实现相同的结果?

+0

这正是我和度量单位看见了,让我在一开始就不使用它们的第一个限制。实际上应该是一些通用的措施,如货币<'u>或度量继承,因为所有有趣的操作都应该在编译时进行。 – nicolas 2012-07-05 07:16:59

+0

你最终使用计量单位吗? – nicolas 2012-07-05 07:17:31

回答

4

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

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

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

+0

这很有道理 - 我猜这是因为IL没有支持度量单位。我已经在C#中获得了一个解决方案,并且可以移植到F#,只是想知道是否会有更多'新颖'的方法。谢谢! – Sam 2010-11-10 01:02:30

1

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

你必须考虑的是你期望从度量单位获得什么样的安全。例如(在一个非常简单的情况下),您将从数据库字段中读取数据,进行一些处理并写回相同的字段,然后使用类型为float<'a> -> float<'a>的函数正是您想要的:您不关心货币是,只要你回来的同一个你投入。

相关问题