【问题标题】:Can we reverse Applicative of List?我们可以反转列表的应用吗?
【发布时间】:2018-03-03 18:28:35
【问题描述】:
I'm reading about scalaz 并注意到我们可以将Applicatives 列表设为Applicative 的List。
def sequenceA[F[_]: Applicative, A](list: List[F[A]]): F[List[A]] = list match {
case Nil => (Nil: List[A]).point[F]
case x :: xs => (x |@| sequenceA(xs)) {_ :: _}
}
问题是我们可以做相反的事情吗?我们可以将F[List[A]] 转换为List[F[A]] 吗?
【问题讨论】:
标签:
scala
scalaz
applicative
scala-cats
【解决方案1】:
如果有问题的F 是Traversable,这是可能的。您显示的代码专用于List,但实际上它适用于所有Traversable 函子。
这意味着,对于每个F 即Traversable 和任何G 即Applicative,我们可以使用sequence 从F[G[A]] 转到G[F[A]]。
List 也有一个Applicative,因此我们可以将它用作我们的G,而在您的示例中,List 用作F,Traversable 函子。
您所要求的示例可能是Option。这是原来的方向:
val x: List[Option[Int]] = ...
val y: Option[List[Int]] = x.sequence
和另一个方向:
val a: Option[List[Int]] = ...
val b: List[Option[Int]] = a.sequence
我们还可以编写另一个专门针对List 的函数:
def sequenceT[F[_]: Traverse, A](list: F[List[A]]): List[F[A]] = ...