Dado que errors
puede ser un List
vacío, y usted se está limitando a no tener ningún valor de tipo A
, no creo que pueda escribir esto como una función total. Para escribir este tipo de firma, deberá hacer trampa simulando que el caso de la lista vacía no existe, p.
def reject[A](errors: List[String]): ValidationNEL[String, A] =
Failure(errors.toNel.get) // bad!
Editar: Como Apocalisp señaló, por supuesto puede hacer esta función totales, mediante la introducción de un error de la lista vacía. Pero sólo haría eso si errors
se calcula en tiempo de ejecución, y sospecho que esto no es el caso de uso, ya que conduciría a errores tontos como:
def reject[A](errors: List[String]): ValidationNEL[String, A] =
Failure(errors.toNel getOrElse NonEmptyList("Error: There were no errors!"))
Por qué no pasar el errors
como NonEmptyList
en su lugar, presumiblemente solo utiliza esta función si tiene errores para usar en tiempo de compilación.
def reject[A](errors: NonEmptyList[String]): ValidationNEL[String, A] =
Failure(errors)
Usted puede hacer esto más concisa utilizar copiando la firma de NonEmptyList.apply
(y especializada a String
):
def reject[A](h: String, t: String*): ValidationNEL[String, A] =
Failure(NonEmptyList(h, t: _*))
Vamos a probarlo:
scala> reject("foo", "bar", "baz")
res0: scalaz.package.ValidationNEL[String,Nothing] = Failure(NonEmptyList(foo, bar, baz))
Se podía hacer la lista vacía también es un error :) – Apocalisp
Es cierto, no pensé en eso (duh). Eso sería útil si 'errors' se calcula en tiempo de ejecución, pero asumí que escribiría literales en su código. Dudo "uy, olvidaste escribir el error en los códigos" sería un error útil en el tiempo de ejecución, entonces. –
O algo realmente útil como "Error: no hubo ningún error". – Apocalisp