如何强制集合(Seq、List 等)只接受正整数 - Scala
How to enforce a Collection (Seq, List etc.) to accept only positive integers - Scala
理想情况下,我希望在 Scala 中强制执行集合以仅允许正整数。有办法吗?
我可以在 运行 时间通过将序列包装在 class 中并验证它的初始化来实现它,但这意味着在 运行 时间处理异常。编译时解决方案会更好。
您可以使用 refined 来定义一个 List[Int @@ Positive]
,即大于零的 Int
列表。然后精化将在编译时检查列表中的所有元素是否为正:
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)
如果您尝试在 List
中放置一个非正数 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 中强制执行集合以仅允许正整数。有办法吗?
我可以在 运行 时间通过将序列包装在 class 中并验证它的初始化来实现它,但这意味着在 运行 时间处理异常。编译时解决方案会更好。
您可以使用 refined 来定义一个 List[Int @@ Positive]
,即大于零的 Int
列表。然后精化将在编译时检查列表中的所有元素是否为正:
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)
如果您尝试在 List
中放置一个非正数 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)
^