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

如何强制集合(Seq、List等)只接受正整数-Scala,scala,compilation,integer,constraints,Scala,Compilation,Integer,Constraints,理想情况下,我希望在Scala中强制执行一个集合,以便只允许正整数。有办法吗 我可以在运行时通过在类中包装一个序列并验证其初始化来实现它,但这意味着在运行时处理异常。编译时解决方案会更好。您可以使用定义一个列表[Int@@Positive],即大于零的Int列表。然后,Finished将在编译时检查列表中的所有元素是否为正: import eu.timepit.refined.auto._ import eu.timepit.refined.numeric.Positive import sha

理想情况下,我希望在Scala中强制执行一个集合,以便只允许正整数。有办法吗

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

您可以使用定义一个
列表[Int@@Positive]
,即大于零的
Int
列表。然后,Finished将在编译时检查列表中的所有元素是否为正:

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)
如果试图将非正的
Int
放入
列表
,则会出现编译错误:

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)
                                                           ^
scala>val posInts:List[Int@@Positive]=List(1,2,3,-4)
:43:错误:谓词失败:(-4>0)。
val posInts:List[Int@@Positive]=List(1,2,3,-4)
^

该系列是一个骗局。首先定义一个“正整数”类型,然后有一个该类型的常规集合;虽然可以使用无形状的Nat类型,但如果只需要Nat,请不要使用它。不确定集合与此有何关系,但包含正固定大小整数(UInt、ULong等)以及正任意精度整数(Natural)的类型。