Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将Seq[Free[Functor,A]]翻转为Free[Functor,Seq[A]]_Scala_Functional Programming_Scalaz - Fatal编程技术网

Scala 如何将Seq[Free[Functor,A]]翻转为Free[Functor,Seq[A]]

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]] = {...}

我正在学习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]] = {...}
我想知道我是否有可能将结果翻转到
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]