F#中的Typechecking测量单位

时间:2014-08-26 21:51:33

标签: f# units-of-measurement typechecking

我试图围绕测量单位以及它们如何在类型测试中工作。特别是,我想在tryfsharp.org的财务示例中检查它们的广义转换函数。这是他们原来的功能:

let convert (rate:decimal<'r>) (value:decimal<'c>) =
    value * rate

这似乎有点缺乏,因为速率和价值之间没有联系。这是我天真的更新:

let convert (rate:decimal<'u/'v>) (value:decimal<'v>) : decimal<'u> =
    value * rate

然而,当我将其输入REPL时,类型被解析为令人沮丧的一般:

val convert : rate:decimal<'u> -> value:decimal<'v> -> decimal<'u 'v>

这并不能阻止你做一些愚蠢的事情,因为我仍然可以愉快地打破我的类型检查:

convert 1.0M<USD/EUR> 1.0M<GBP>

这不是错误,而是产生无益的

val it : decimal<USD GBP/EUR> = 1.0M

我在这里做错了吗?

0 个答案:

没有答案