2012-06-23 11 views
9

Scalaz için oldukça yeni ve doğrulamalarla başladım.Düzleştirici İç içe Scalaz Değerlemeler

(validateXyz(...) |@| validateAbc(...)) { (first, second) => 
    otherFunction(first, second) 
} 

: Sonra birden doğrulamaları birleştirmek ve daha sonra da bir doğrulama döndüren başka işlevi çağırmak için uygulamalı stil kullanıyorum

def validateXyz(...): ValidationNEL[String, String] = ... 

:

Ben formun bazı doğrulama işlevlere sahiptir burada, yukarıdaki tür çağrılırken, bununla birlikte,

def otherFunction(first: String, second: String): ValidationNEL[String, String] = ... 

olduğu:

def propagateF(result: NonEmptyList[String]): ValidationNEL[String, String] = result.fail 
def propagateV(result: ValidationNEL[String, String]) = result 

result.fold(propagateF, propagateV) 
// result type: ValidationNEL[String, String] 

Bu:

val result: ValidationNEL[String, ValidationNEL[String, String]] = ... 

Sadece olarak nel yayıldığı önce başarısız iki fonksiyon ile sonucu kat ve bu ikinci sadece bir bağımsız değişken yayar arayarak paketten Doğru türleri ve sonuçları işler ve döndürür. Ancak doğru çözüm gibi hissetmiyor, bu yüzden bir şeyleri kaçırmam gerekiyor. Sonunda bu korkunç katlamayı önlemek için ne yapmam gerekiyor?

cevap

8

Burada neye bakıyorsunuz monadic join.

Validation'un kendisi bir hata değildir, çünkü bu hata tarafından korunamayan bir Semigroup yapısını taşır. Ancak ihtiyacınız olursa, her zaman Either monadına inebilirsiniz. Bu işlevsellik flatMap tarafından sağlanmaktadır. Eğer dışarıdan bir hata varsa

(validateXyz(...) |@| validateAbc(...))(otherFunction).flatMap(x => x) 

, sonuç o hata olacaktır. Bir başarı içinde bir hata varsa, sonuç iç hata olacaktır. Aksi halde sonuç bir başarı olacaktır. İç ve dış numaralı telefondan numaralı bir hatayı almanın imkansız olduğunu unutmayın. Bu nedenle, hataları birleştirmek istiyorsanız Monad yerine Applicative'u kullanmanız gerekir.