2016-02-16 14 views
5

ScalaZ'de, Option[Validation[E, A]]'u Validation[E, Option[A]]'a dönüştürmenin deyimsel yolu nedir? Aşağıdaki varsayımsal kodda ÖrneğinBir Seçeneği Dönüştür [Doğrulama [E, A]] Doğrulama [E, Seçenek [A]]

:

def convert(x: Option[Validation[E, A]]): Validation[E, Option[A]] =  
    /* ??? */ 

def validateThing(thing: A): Validation[E, A] = 
    /* whatever */ 

def exampleUseCase(maybeThing: Option[Thing]): Validation[E, Option[Thing]] = { 
    val validated: Option[Validation[E, Thing]] = a.map(validateThing(_)) 

    // ... 

    val result: Validation[E, Option[Thing]] = convert(validated) 
    result 
} 

convert uygulanması deyimsel ScalaZ ne gibi görünürdü?

+1

Bu dönüşümün bana mantıklı gelmediğini söyleyebilirim. "Belki", "Yok" ise ne sonuç beklerdin? Muhtemelen başarısız doğrulama, hiçbiri, eğer hiç bir şey değilse o zaman değer elde edip “başarılı” bir durum olarak koyabilirsiniz, o zaman “Seçenek” e ihtiyacınız olmaz. – 4lex1v

+0

“validate” ve “validateThing” ifadeleri varsayımsaldır, sadece böyle bir dönüşümün * gerçekleşebileceği yeri göstermektir. Ben sadece dönüştürmenin uygulanmasının ne olacağıyla ilgileniyorum. – kes

+0

Ama belki de 'Bu', 'Yok' olduğunda ne beklemesi gerektiği ile ilgili soruya cevap vermek: 'Hiçbiri'nin başarılı bir şekilde doğrulanması. – kes

cevap

4

İki olası çözümü burada görebiliyorum. Muhtemelen argüman, örneğin üzerine desen eşleştirme kullanarak en kolayı:

Scalaz tabanlı bir çözüm için
def convert[A](v: Option[Validation[Throwable, A]]): Validation[Throwable, Option[A]] = { 
    v match { 
    case None => Validation.success(None) 
    case Some(valid) => valid.map(Some(_)) 
    } 
} 

, ben yaklaşık sequence olası sorunları yapabilirsiniz toplamak yerine Doğrulama ValidationNel, kullanmak gerekir bu şekilde düşünüyordum Traversable ile convert uygulamak: Doğrulama iki tip parametresi vardır çünkü

def convert[A](v: Option[ValidationNel[Throwable, A]]): ValidationNel[Throwable, Option[A]] = 
    Traverse[Option].sequenceU(v) 

i yerine sequence ait sequenceU kullanıyorum aslında unutmayınız, bu doğru tür kesmesi için iç Scalaz büyü başka bir şey değildir. Umarım

+2

Her şeyi veya en azından "std.option._" ve "syntax.traverse._" içe aktardıysanız, 'c.sequenceU' yazabilirsiniz. –

İlgili konular