在Scala中表达Ada风格的约束和子类型?

时间:2014-04-15 20:47:25

标签: scala ada

在Scala中是否有一种实用的方法来表达数字值和类型的范围,采用Ada的风格?

-- newtype derived from Float
type Pounds is new Float;

-- constraint on an individual variable
Cat_Weight: Pounds range 0.0 .. 10.0; 

 -- constraint on an entire subtype of Float
subtype People_Pounds is Pounds range 0.0 .. 300.0;

(好吧,不是最现实的例子,而是改编自Ada Safe and Secure。据我所知,Ada中的范围检查是运行时检查,如果违反则会抛出异常,如果需要可以在生产中禁用。 )

理想情况下使用未装箱的表示,但对任何实际解决方案感兴趣。 Value classes似乎不是一种选择,至少不是孤立的:

class Month(val m: Int) extends AnyVal {
    assert(m >= 1 && m <= 12) // Does not compile: assertion not allowed
}

我们可以使用assertrequire创建一个案例类:

case class Month2(val m: Int) {
  require(m >= 1 && m <= 12)
}

但是这不是一个Integer子类型,我们可能需要给它一个Numeric类型类实例 - 这是唯一的方法吗?

0 个答案:

没有答案