如何将类型约束到另一个的子集?

时间:2011-02-10 22:56:16

标签: scala types

我有这是一个愚蠢的问题感觉,但是这里...我可以定义一个类型是另一个类型的元素的子集吗?这是一个简化的例子。

scala> class Even(i: Int) {
     | assert(i % 2 == 0)  
     | }
defined class Even

scala> new Even(3)
java.lang.AssertionError: assertion failed

这是运行时检查。我可以定义一个类型,以便在编译时检查它吗? IE,输入参数i可证明始终是偶数?

1 个答案:

答案 0 :(得分:7)

Coq和Agda等语言的值依赖类型可以做到这一点,但不是Scala。

根据确切的用例,有一些方法可以在类型系统中编码peano号码,但这可能对你有帮助。

您可能还想尝试定义EvenOdd以及一些密封的抽象超类型(或许OddOrEven)以及从任何给定的Integer返回正确实例的工厂方法。

另一种可能性是将Even定义为提取器。