我们可以反转 List 的 Applicative 吗?

Can we reverse Applicative of List?

I'm reading about scalaz 并注意到我们可以将 Applicative 的列表作为 ListApplicative

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]] 吗?

如果有问题的 FTraversable,这是可能的。您显示的代码专用于 List,但实际上它适用于所有 Traversable 函子。

这意味着,对于 Traversable 的每个 FApplicative 的任何 G,我们可以从 F[G[A]]G[F[A]]sequence.

List 也有一个 Applicative,因此我们可以将其用作我们的 G,而在您的示例中 List 用作 FTraversable 函子。

一个您所要求的有效示例可能是 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]] = ...