我们可以反转 List 的 Applicative 吗?
Can we reverse Applicative of List?
I'm reading about scalaz 并注意到我们可以将 Applicative
的列表作为 List
的 Applicative
。
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]]
吗?
如果有问题的 F
是 Traversable
,这是可能的。您显示的代码专用于 List
,但实际上它适用于所有 Traversable
函子。
这意味着,对于 Traversable
的每个 F
和 Applicative
的任何 G
,我们可以从 F[G[A]]
到 G[F[A]]
与 sequence
.
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]] = ...
I'm reading about scalaz 并注意到我们可以将 Applicative
的列表作为 List
的 Applicative
。
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]]
吗?
如果有问题的 F
是 Traversable
,这是可能的。您显示的代码专用于 List
,但实际上它适用于所有 Traversable
函子。
这意味着,对于 Traversable
的每个 F
和 Applicative
的任何 G
,我们可以从 F[G[A]]
到 G[F[A]]
与 sequence
.
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]] = ...