2012-09-25 27 views
7

Ben reddetmek yöntem, tip A iade edilmesi asla aşağıdaki imza bu yanadönüştürme listesi [Dize]

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

bir işlev var ama gerek imzayı eşleştirmek için yansıtılmak üzere. Ben şöyle benim istenilen sonucu elde etmek tipi lambdas ile karıştırmasını:

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

Bu tip List[A] kullanan (ya da görünür), daha doğrusu benim istenen tip A daha. Aradığım sonucu elde etmenin standart bir yolu var mı?

cevap

5

errors boş bir List olabilir ve A türünde hiçbir değere sahip olmaya zorlandığınız için, bunu toplam işlev olarak yazabileceğinizi düşünmüyorum. Bu tür bir imzayı yazmak için, boş liste vakasının mevcut olmadığını varsayarak hile yapmanız gerekir, ör.

def reject[A](errors: List[String]): ValidationNEL[String, A] = 
    Failure(errors.toNel.get) // bad! 


Düzenleme: Apocalisp işaret olarak, tabii ki boş listesi için bir hata getirerek, bu toplam fonksiyonu yapabilirsiniz. Neden olarak errors geçemeyen

def reject[A](errors: List[String]): ValidationNEL[String, A] = 
    Failure(errors.toNel getOrElse NonEmptyList("Error: There were no errors!")) 

: Ama sadece errors zamanında hesaplanır ve şüpheli eğer o gibi saçma hatalara yol açacak şekilde bu, durumunuzun olmadığını yapacağını NonEmptyList yerine - muhtemelen derleme zamanında kullanmak için hatalarınız varsa bu işlevi kullanırsınız.

def reject[A](errors: NonEmptyList[String]): ValidationNEL[String, A] = 
    Failure(errors) 
Sen NonEmptyList.apply imzasını kopyalayarak (ve String bunu uzmanlaşmış) tarafından kullanmak için bu terser yapabilirsiniz

:

def reject[A](h: String, t: String*): ValidationNEL[String, A] = 
    Failure(NonEmptyList(h, t: _*)) 

Şunu deneyelim:

scala> reject("foo", "bar", "baz") 
res0: scalaz.package.ValidationNEL[String,Nothing] = Failure(NonEmptyList(foo, bar, baz)) 
+0

Sadece yapabilir boş liste de bir hata :) – Apocalisp

+0

Bu doğru, ben bunu düşünmedim (duh). Bu hatalar, çalışma zamanında hesaplanırsa yararlı olur, ancak onun kodunda basit yazılar yazacağını varsaydım. Öyleyse, "hatalar, hatayı kodlara yazmayı unuttun", o zaman çalışma zamanında yararlı bir hata olur. –

+1

Ya da gerçekten "Hata: Hata yok" gibi yararlı bir şey. – Apocalisp