【问题标题】:Can we reverse Applicative of List?我们可以反转列表的应用吗?
【发布时间】:2018-03-03 18:28:35
【问题描述】:

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】:

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

    这意味着,对于每个FTraversable 和任何GApplicative,我们可以使用sequenceF[G[A]] 转到G[F[A]]

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

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      相关资源
      最近更新 更多