scala - 如何使用 scalaz 中的序列将 T[G[A]] 转换为 G[T[A]]

标签 scala scalaz scalaz7

我有这段代码,可以使用 scalaz 序列将 List[Future[Int]] 转换为 Future[List[Int]]。

import scalaz.concurrent.Future

val t = List(Future.now(1), Future.now(2), Future.now(3)) //List[Future[Int]]
val r = t.sequence //Future[List[Int]]

因为我使用的是scalaz中的Future,所以它可能有隐式解析来为我发挥魔力,我只是想知道类型类是否是自定义类而不是像Future那样预定义的类,我如何定义隐式解析来实现相同的效果结果

case class Foo(x: Int)

val t = List(Foo(1), Foo(2), Foo(3)) //List[Foo[Int]]

val r = t.sequence //Foo[List[Int]]

提前非常感谢

最佳答案

您需要创建一个位于隐式范围内的 Applicative[Foo] (或 Monad[Foo])。

您所要求的完全行不通,因为您的 Foo 没有普遍量化(因此您预期的 r 类型没有意义,因为 >Foo[List[Int]],因为 Foo 不采用类型参数。

让我们以不同的方式定义Foo:

case class Foo[A](a: A)

object Foo {
  implicit val fooApplicative = new Applicative[Foo] {
      override def point[A](a: => A) = Foo(a)
      override def ap[A,B](fa: => Foo[A])(f: => Foo[A=>B]): Foo[B] = Foo(f.a(fa.a))
  } 
}

现在,如果我们确保这个隐式在范围内,我们就可以排序:

scala> val t = List(Foo(1), Foo(2), Foo(3)) 
t: List[Foo[Int]] = List(Foo(1), Foo(2), Foo(3))

scala> t.sequence
res0: Foo[List[Int]] = Foo(List(1, 2, 3))

关于scala - 如何使用 scalaz 中的序列将 T[G[A]] 转换为 G[T[A]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26620810/

相关文章:

Scala Play 异常 : Placeholder not replaced

scala - 条件特征混合

scala - Azure Databricks 将文件写入 Azure Data Lake Gen 2

scala - 状态 Monad 中的 Monadic 归约

Scala 反射与序列化(通过 Spark) - 符号不可序列化

scala - 正确使用 scalaz Future 进行异步执行

scala - 点阅读器 monad scala

Scalaz monad 转换器。将 f1 :A => G[B], f2:B => G[C] 函数应用于 F[G[A]] 对象

scala - 为什么 List 是一个半群而 Seq 不是?

Scalaz 未装箱标记类型不会自动拆箱