gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:29:54 26 4
gpt4 key购买 nike

当我在设计模型时,我在两种不同的指示类型参数的方法之间左右为难 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com