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

在Scala中表达Ada风格的约束和子类型?,scala,ada,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 Pound

在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中的范围检查是运行时检查,如果违反会引发异常,如果需要,可以在生产中禁用。)

理想情况下使用非固定表示,但对任何实际解决方案感兴趣。似乎不是一个选项,至少不是孤立的:

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

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

您可以使用
require(m>=1&&m不在值类中-
assert
require
都会产生编译错误
“这个语句在值类中是不允许的”
的实现有用吗?Jscience(和类似的Scala库,如,都很有用,但它们似乎处理指定/约束维度而不是值)实现了一个问题建议的示例。使用case类和type类对其进行编码。
case class Month2(val m: Int) {
  require(m >= 1 && m <= 12)
}