用Scala中的单位表示数量

时间:2009-05-05 08:14:01

标签: scala idioms

我需要支持单位数量。我希望类型系统尽可能地强制执行单位正确性。例如,不应该将克与美元组合。我走的是参数化类型的路径,但是这个代码似乎比我从其他人看到的Scala代码重复得多。

abstract class UnitOfMeasure

abstract class Range[T] {
  type T <: UnitOfMeasure
}
class Quantity[T <: UnitOfMeasure](value: Double)
class DefiniteRange[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T]) extends Range[T]
class Confidence(conf: Double) {
  require(0.0 <= conf && conf <= 1.0)
}
class ConfidenceInterval[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T], confidence: Confidence) extends Range[T] {
    def this(lower: Quantity[T], upper: Quantity[T]) = this(lower, upper, new Confidence(.90))
}

有更清洁的方法吗? “T&lt;:UnitOfMeasure”的鼓声是困扰我的主要因素。

3 个答案:

答案 0 :(得分:4)

我刚发现这篇文章

http://www.michaelnygard.com/blog/2009/05/units_of_measure_in_scala.html

希望它有所帮助。

答案 1 :(得分:1)

我没有这本书,但也许你需要self type。您可以将类包含在另一个类中,并添加要在类范围中使用的类型定义。

答案 2 :(得分:1)

来自mdmcnlly:

  

我记得在中看到一个例子   Scala中的编程书那个dealth   有一种基本类型的动物有一个   兼容的食物和亚型   只能吃他们兼容的   亚型而不是其他食物。一世   感觉它是相关的,但我不是   当然。也许有人拿着这本书   方便可以梳理出好的掘金。   解决方案的要点是使用   相反,键入基类的成员   这些方差注释全都是   这个地方。