当我在设计模型时,我在两种不同的指示类型参数的方法之间左右为难 List
必须是 nonEmpty
.我开始使用 List[Int]
随附 require
声明验证List
是 nonEmpty
.
case class A(name: String, favoriteNumbers: List[Int]) {
require(favoriteNumbers.nonEmpty, "favoriteNumbers must not be empty")
}
然后我需要将列表设为可选。如果
List
提供,必须是nonEmpty
.我正在使用 Option[List[Int]]
随附 require
语句来验证,如果Option
是 nonEmpty
,列表也必须是 nonEmpty
.case class B(name: String, favoriteNumbers: Option[List[Int]]) {
require(
favoriteNumbers.isEmpty || favoriateNumbers.get.nonEmpty
, "when defined, favoriteNumbers.get must be nonEmpty"
)
}
但是,我需要使用这个非空
List
我正在建模的整个系统中。这意味着我的代码具有相同的 require
到处重复的陈述。有没有一种(非 ScalaZ)方法来拥有一个新类型,比如 NeList
,它的定义和行为与 List 相同,唯一的变化是当 NeList
时抛出异常尝试在没有元素的情况下实例化?我为此尝试了谷歌,但找不到一组搜索词来磨练这一领域。我要么变得非常简单
List
操作方法,或对 ScalaZ 的 NEL(非空列表)的各种引用。所以,如果有一个链接可以帮助解决这个问题,我很乐意看到它。
最佳答案
如果你
def foo[A](x: ::[A]) = "List has length "+x.length
然后您坚持该列表为非空。但是当然,您的列表都输入为
List
,所以你需要一个辅助方法来给你一个非空列表:implicit class NonEmptyList[A](private val underlying: List[A]) {
def ifNonEmpty[B](f: ::[A] => B): Option[B] = {
underlying match {
case x: ::[A @unchecked] => Some(f(x))
case _ => None
}
}
}
现在您可以安全地应用该操作来获得
Option
出去。 (您也可以在类似 foreach 的方法中运行副作用函数。)现在,这是相当不惯用的 Scala。但它在编译时是安全的(尽管
@unchecked
---Scala 的编译器不够聪明,无法意识到类型参数没有改变)。
关于list - 键入要求非空列表的最佳方式是什么(不使用 Scalaz)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28223692/