Scala 如何将Seq[Free[Functor,A]]翻转为Free[Functor,Seq[A]]
我正在学习scalaz Free monad。我想知道如何将Scala 如何将Seq[Free[Functor,A]]翻转为Free[Functor,Seq[A]],scala,functional-programming,scalaz,Scala,Functional Programming,Scalaz,我正在学习scalaz Free monad。我想知道如何将Seq[Free[Functor,A]]转换为Free[Functor,Seq[A]]类似的Future.sequence 这是密码 type Functor[A] = Coyoneda[Command, A] type Script[A]= Free[Functor, A] case instruction(...) def sequence(): Seq[Script[Instruction]] = {...}
Seq[Free[Functor,A]]
转换为Free[Functor,Seq[A]]
类似的Future.sequence
这是密码
type Functor[A] = Coyoneda[Command, A]
type Script[A]= Free[Functor, A]
case instruction(...)
def sequence(): Seq[Script[Instruction]] = {...}
我想知道我是否有可能将结果翻转到Script[Seq[Instruction]]
,如果它可以像Future那样,那么原因是否是一个单子
非常感谢您提前免费。freeMonad#序列将帮助您翻转Cats和Scalaz中的类型构造函数。另一种方法是通过隐式证据要求monad实例,并使用编译器注入的隐式实例。只要存在
遍历[F]
和应用[G]
实例,就会对F[G[A]]
执行Seq[Script[Instruction]
操作。您确实有Applicative[Script]
实例(Script
是Monad
,因此它也是Applicative
),但是scalaz
没有为Seq
提供遍历
实例。(不可变的Seq
原则上是可遍历的,但作者选择不提供Traverse[Seq]
实例,可能是因为Seq
是抽象的,因此scalaz不能保证返回相同的Seq
实现。)
因此,我将回答List
,而不是Seq
import scalaz.std.list._
import scalaz.syntax.traverse._
val scripts: List[Script[A]] = ???
val script: Script[List[A]] = scripts.sequence[Script, A]