这个功能:
let convert (v: float<_>) =
match v with
| :? float<m> -> v / 0.1<m>
| :? float<m/s> -> v / 0.2<m/s>
| _ -> failwith "unknown"
产生错误
类型“float”没有任何适当的子类型,不能用作类型测试或运行时强制的源。
有什么方法可以匹配度量单位吗?
As @kvb详细解释一下,问题在于度量单位是类型的一部分。这意味着float<m>
类型不同float<m/s>
(不幸的是,此信息不会作为运行时值的一部分存储)。
因此,您实际上是在尝试编写一个可以处理两种不同类型输入的函数。干净的函数式解决方案是声明一个可区分的联合,它可以保存第一类型或第二类型的值:
type SomeValue =
| M of float<m>
| MPS of float<m/s>
然后你可以使用普通的模式匹配来编写函数:
let convert v =
match v with
| M v -> v / 0.1<m>
| MPS v -> v / 0.2<m/s>
您需要将这些值显式包装到可区分的联合值中,但这可能是直接执行此操作的唯一方法(无需对程序结构进行一些较大的更改)。
对于普通类型,例如int
and float
,您还可以使用重载成员(在某些 F# 类型中声明),但这不适用于度量单位,因为 F# 编译器擦除单位信息后签名将相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)