2014-10-29 65 views
2

我使用scalaz將此[List [Future [Int]序列。如何使用scalaz中的序列將T [G [A]]轉換爲G [T [A]]

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未來,所以它可能隱含的分辨率做魔術對我來說,我只是想知道的類型類是定製類未預先定義一個像未來,我該怎麼定義的隱式解析要達到同樣的效果

case class Foo(x: Int) 

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

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

提前

回答

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)) 
+0

感謝您的回答,一個錯字是覆蓋def point(a:=> A)= Foo(a)應該改變以覆蓋def point [A](a:=> A)= Foo(a)。 – 2014-10-29 23:52:33

相關問題