list - 键入要求非空列表的最佳方式是什么(不使用 Scalaz)?

标签 list scala

当我在设计模型时,我在两种不同的指示类型参数的方法之间左右为难 List必须是 nonEmpty .我开始使用 List[Int]随附 require声明验证ListnonEmpty .

case class A(name: String, favoriteNumbers: List[Int]) {
  require(favoriteNumbers.nonEmpty, "favoriteNumbers must not be empty")
}

然后我需要将列表设为可选。如果List提供,必须是nonEmpty .我正在使用 Option[List[Int]]随附 require语句来验证,如果OptionnonEmpty ,列表也必须是 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/

相关文章:

scala - 获取所有子序列的列表

algorithm - Scala:如何通过分组(或分箱)获取 Iterable 的前 N ​​个元素

python从一对列表创建制表符分隔的文本文件

python - 从元组中获取相同的元素并返回两个索引列表

python - 如何使用 python 对对象列表进行排序?

scala - Scala 中是否有一种将数字列表转换为范围列表的好方法?

java - 如何用Scala写Apache bench之类的东西(多线程方式打网页)

scala - 你如何编写一个惯用的 Scala Quicksort 函数?

c# - VS 2010 报表查看器无法访问嵌套集合,有人吗?

python - 如何查找包含特定元素的嵌套列表最后一次出现的索引?