我试图围绕测量单位以及它们如何在类型测试中工作。特别是,我想在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
我在这里做错了吗?