我需要支持单位数量。我希望类型系统尽可能地强制执行单位正确性。例如,不应该将克与美元组合。我走的是参数化类型的路径,但是这个代码似乎比我从其他人看到的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 <!>”;是困扰我的主要事情。

有帮助吗?

解决方案

我刚发现这篇文章

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

希望它有所帮助。

其他提示

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

来自mdmcnlly:

  

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top