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