如何强制收集(Seq,List等)只接受正整数 - Scala

Sid*_*Sid 3 integer scala compilation constraints

理想情况下,我希望在Scala中强制执行Collection以仅允许正整数.有办法吗?

我可以在运行时通过将Sequence包装在类中并验证它的初始化来实现它,但这意味着在运行时处理异常.编译时解决方案会更好.

Fra*_*mas 5

您可以使用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)