2016-03-27 20 views
2

Scalaz Free monad'ı öğreniyorum. Ben burada Seq [Serbest [Functor, A]] nasıl Serbest çevirilir [Functor, Seq [A]]

Future.sequence

gibi Seq[Free[Functor, A]]- Free[Functor, Seq[A]] benzer alabilirsiniz nasıl acaba

type Functor[A] = Coyoneda[Command, A] 
    type Script[A]= Free[Functor, A] 

    case instruction(...) 

    def sequence(): Seq[Script[Instruction]] = {...} 

Size öyle Gelecek gibi olabilir ben Script[Seq[Instruction]] sonucu çevirebilirsiniz o mümkündür acaba kodudur Bu, Free'nin bir monad olmasının nedeni mi?

cevap

1

Traverse[F] ve Applicative[G] durum vardır her F[G[A]] (örneğin Seq[Script[Instruction]]) için sequence işlem vardır. Applicative[Script] örneğiniz var (Script , bu nedenle de Applicative), ancak scalazSeq için Traverse örneği sağlamaz. (Immutable Seq prensip sürülebilir içinde olmakla yazarlar Seq soyut olduğu için muhtemelen Traverse[Seq] örneği, vermek istemediği ve dolayısıyla scalaz aynı Seq uygulanmasını size geri vermek garanti edemeyiz.)

Bu nedenle List için cevap yerine edecek Seq.

import scalaz.std.list._ 
import scalaz.syntax.traverse._ 

val scripts: List[Script[A]] = ??? 
val script: Script[List[A]] = scripts.sequence[Script, A] 
0

Free.freeMonad # dizisi sen Cats ve Scalaz hem tip kurucular çevirmek yardımcı olacaktır peşin

çok teşekkürler. Alternatif, örtülü kanıt yoluyla monad örneğini gerektirir ve bunun yerine derleyici enjekte edilen örtük örneklerini kullanır.