Sid*_*Sid 3 integer scala compilation constraints
理想情况下,我希望在Scala中强制执行Collection以仅允许正整数.有办法吗?
我可以在运行时通过将Sequence包装在类中并验证它的初始化来实现它,但这意味着在运行时处理异常.编译时解决方案会更好.
您可以使用refine来定义a List[Int @@ Positive],即Int大于零的s 列表.然后,精炼将在编译时检查列表中的所有元素是否为正数:
import eu.timepit.refined.auto._
import eu.timepit.refined.numeric.Positive
import shapeless.tag.@@
scala> val posInts: List[Int @@ Positive] = List(1, 2, 3)
posInts: List[Int @@ Positive] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如果你试图将非正数Int放入List,你会得到一个编译错误:
scala> val posInts: List[Int @@ Positive] = List(1, 2, 3, -4)
<console>:43: error: Predicate failed: (-4 > 0).
val posInts: List[Int @@ Positive] = List(1, 2, 3, -4)
^
Run Code Online (Sandbox Code Playgroud)