2016-04-11 21 views
1

Şu anda scalaz State Monad ile oynamaktayım. Bir başlangıç ​​durumuna dinamik bir modifikasyon uygulanacak bir işlem boru hattı uygulamak istiyorum. Tüm süreçler tamamlandıktan sonra nihai bir Devlet çıkmak istiyorum.Bir scalaz State Monad üzerindeki talihsizliklerin listesini anlamadan nasıl uygulayabilirsiniz

İşte daha iyi bir grafik örneği.

     +-------+  +-------+  +-------+ 
         |  |  |  |  |  | 
Initial State +-----> | m1 | +----> | m2 | +----> | m3 | +----> Final State 
         |  |  |  |  |  | 
         +-------+  +-------+  +-------+ 

Ben Bu şimdiye kadar çalışır bu kodu

import scalaz._ 
import Scalaz._ 

object Main2 { 

    def main(args: Array[String]) { 

    val m1 = State[String, Unit] { (x:String) =>(x + " " + x,())} 
    val m2 = State[String, Unit] { (x:String) =>(x.toUpperCase(),())} 
    val m3 = State[String, Unit] { (x:String) =>(x.toLowerCase(),())} 

    val finalState = for(
     _ <- m1; 
     _ <- m2; 
     f <- m3 
    ) yield (f) 

    println(finalState.run("Foo")) 

    } 

} 

ile geldi ama öylesine anlama için kullanamazsınız derleme zamanında modiffications tam sayısını bilmiyorum. i gerekenler

o ben bir anlama için aynı etki kullanırsınız gibi yani bu

import scalaz._ 
import Scalaz._ 

object Main2 { 

    def main(args: Array[String]) { 

    val m1 = State[String, Unit] { (x:String) =>(x + " " + x,())} 
    val m2 = State[String, Unit] { (x:String) =>(x.toUpperCase(),())} 
    val m3 = State[String, Unit] { (x:String) =>(x.toLowerCase(),())} 

    type MyState = State[String, Unit]; 

    val modifications = List[MyState](m1,m2,m3); 

    modifications.???.run("Foo") 

    } 

} 
  1. nasıl başlangıç ​​durumuna üzerinde Foo durum bilgisi hesaplamaların bu listeyi uygulayabilirsiniz nedir?
  2. Bunu bir hata hızında başarısızlık hata kullanımıyla nasıl birleştirebilirim?

Bu, hata işleme konusunda yaptığım değişiklikler için daha iyi bir imza olur mu? Yardımlarınız

cevap

1

Eh için

type ModificationType = StateT[Try, String, Unit] 

sayesinde kolay yolu esasen anlama için bir yeniden yazılmış halidir

modifications.reduceLeft((a: MyState, b:MyState) => a.flatMap(_ => b)); 

gibi bir şeydir. scalaz ayrıca

modifications.sequenceU 

kullanılabilir sequenceU sağlar ama bu konuda emin değilim gibi

görünüyor. (Benimle scala derleyicim yok)

İkinci sorunuz için, evet, size ihtiyacınız olanı sağlamanız gerekir.

+0

Her iki çözüm de gerçekten işe yaradı! Teşekkürler – Jay

İlgili konular