2012-09-25 24 views
7

que tiene una función con la siguiente firmaLista Convert [cadena] en ValidationNEL [String, A] en una función

def reject[A](errors: List[String]): ValidationNEL[String, A] 

Dado que este es, no sería devuelto el tipo A un método rechazar pero necesito debe reflejarse para que coincida con la firma. Yo estaba jugando con lambdas tipo para obtener el resultado deseado de la siguiente manera:

errors.map(Failure[String, A](_).liftFailNel).sequence[({type l[a] = ValidationNEL[String, a]})#l, A] 

Este utiliza el tipo List[A] (o parece), en lugar de mi tipo deseado A. ¿Hay una manera estándar de obtener el resultado que estoy buscando?

Respuesta

5

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)) 
+0

Se podía hacer la lista vacía también es un error :) – Apocalisp

+0

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. –

+1

O algo realmente útil como "Error: no hubo ningún error". – Apocalisp