我们可以撤销列表的应用吗?

问题描述 投票:1回答:1

I'm reading about scalaz并注意到我们可以列出Applicatives是ApplicativeList

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个回答
5
投票

如果FTraversable,这是可能的。您展示的代码专门用于List,但实际上它适用于所有Traversable仿函数。

这意味着,对于FTraversable的任何G的每个Applicative,我们可以用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]] = ... 
© www.soinside.com 2019 - 2024. All rights reserved.