我有这是一个愚蠢的问题感觉,但是这里...我可以定义一个类型是另一个类型的元素的子集吗?这是一个简化的例子。
scala> class Even(i: Int) {
| assert(i % 2 == 0)
| }
defined class Even
scala> new Even(3)
java.lang.AssertionError: assertion failed
这是运行时检查。我可以定义一个类型,以便在编译时检查它吗? IE,输入参数i
可证明始终是偶数?
答案 0 :(得分:7)
Coq和Agda等语言的值依赖类型可以做到这一点,但不是Scala。
根据确切的用例,有一些方法可以在类型系统中编码peano号码,但这可能对你有帮助。
您可能还想尝试定义Even
和Odd
以及一些密封的抽象超类型(或许OddOrEven
)以及从任何给定的Integer返回正确实例的工厂方法。
另一种可能性是将Even
定义为提取器。