我有这段代码,可以使用 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/