Когда я работаю над моделью проекта, я разрываю между двумя разными способами указания параметра типа 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 пытается создать экземпляр без элементов?
Я попробовал Google для этого и не смог найти набор условий поиска, чтобы отточить эту область. Я либо получил очень простые List инструкции, либо всевозможные ссылки на ScalaZ NEL (Non Empty List). Итак, если есть связь, которая поможет с этим, я бы с удовольствием это увидел.