2

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

よろしくお願いします

4

1 に答える 1

3

暗黙のスコープ内にある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))
于 2014-10-29T03:44:35.117 に答える