F# 具有度量单位功能,在http://msdn.microsoft.com/en-us/library/dd233243.aspx中描述如下:
[<Measure>] type unit-name [ = measure ]
这允许定义单位,例如:
type [<Measure>] USD
type [<Measure>] EUR
以及要写成的代码:
let dollars = 25.0<USD>
let euros = 25.0<EUR>
// Results in an error as the units differ
if dollars > euros then printfn "Greater!"
它还处理转换(我猜这意味着 Measure 定义了一些函数,可以让Measures 进行乘法、除法和取幂):
// Mass, grams.
[<Measure>] type g
// Mass, kilograms.
[<Measure>] type kg
let gramsPerKilogram: float<g kg^-1> = 1000.0<g/kg>
let convertGramsToKilograms (x: float<g>) = x / gramsPerKilogram
我的直觉告诉我应该可以在 Haskell 中实现类似的功能,但我无法找到任何示例来说明如何做到这一点。
编辑:哦,我的话,这是一个巨大的蠕虫罐头!http://research.microsoft.com/en-us/um/people/akenn/units/CEFP09TypesForUnitsOfMeasure.pdf上有一篇研究论文。我猜想实现整个事情不仅仅是几行代码。夏季项目有人吗?:)