2015-11-04 73 views
3

更高kinded類型斯卡拉列表,期權和其他複雜類型

我仍然在學習斯卡拉 - 所以請原諒我,如果這是非常簡單的實現。我對Scalaz或Shapeless也不太流利 - 我只是開始探索這些庫。我在尋找一個簡單的論文某處這可以解釋給我,我怎麼可以這樣做

trait AmazingMalini[F[G[_]]] { 
     def fMap[A,B](aa: F[G[A]])(f : A => F[G[B]]) : F[G[B]] 
} 

然後我想能夠做這樣的事情 -

trait SomeCrazyMagicWithList extends AmazingMalini[Option[List]]{ 
    def fMap[A,B](aa: Option[List[A]])(f : A => Option[List[B]]) :Option[List[B]] = ??? 
} 

注意該選項或列表類型只是示例我有幾個容器類型,我會在那裏置換(構建一個像DSL一樣的小圖形遍歷)。

+0

我不知道這是正確的解決方案,但似乎工作:'特質AmazingMalini [F [G],G [_]]','特質SomeCrazyMagicWithList延伸AmazingMalini [Option,List]'。其餘代碼不變。 –

+1

我會避免使用相同的標識符'G'作爲不同的事情,這是相當混亂。換句話說,最好是'AmazingMalini [F [_],G [_]]' –

回答

5

你要的AmazingMalini簽名更改爲trait AmazingMalini[F[_], G[_]]

方法,然後可以像這樣實現的:

trait AmazingMalini[F[_], G[_]] { 
def fMap[A,B](aa: F[G[A]])(f : A => F[G[B]]) : F[G[B]] 
} 

trait SomeCrazyMagicWithList extends AmazingMalini[Option, List] { 
    def fMap[A, B](aa: Option[List[A]])(f: A => Option[List[B]]): Option[List[B]] = 
    aa.flatMap { 
     _ match { 
     case Nil   => Some(Nil) 
     case as: List[A] => as.map(f).reduce(concat(_, _)) 
     } 
    } 

    def concat[A](x: Option[List[A]], y: Option[List[A]]): Option[List[A]] = for { 
    xs <- x 
    ys <- y 
    } yield xs ++ ys 
} 

注意Scalaz提供monad transformers,使某些單子的堆疊。例如:

  • OptionT變壓器使上的Option頂部任何單子的堆疊:List[Option[A]]Future[Option[A]]
  • ListT變壓器使上的List頂部任何單子的堆疊:Option[List[A]]Future[List[A]]

所以,你的情況,你可以使用ListT這樣的:

import scalaz._ 
import Scalaz._ 
import ListT._ 

listT(List(1,2,3).some).flatMap(i => listT(List(i, i * 3).some)) 

res0: scalaz.ListT[Option,Int] = ListT(Some(List(1, 3, 2, 6, 3, 9))) 

您也可以使用,內涵與單子變壓器:

for { 
    x <- listT(List(1,2).some) 
    y <- listT(List(3,4).some) 
} yield x + y 

res2: scalaz.ListT[Option,Int] = ListT(Some(List(4, 5, 5, 6))) 
+0

好的答案 - 我希望有人會潛入lambda技巧 - 並因此向我解釋語法...但這個工程;-) –

+0

@ user1525079哪個lambda招? :0 – dcastro

+0

@ user1525079我認爲你的意思是「類型拉姆達」技巧:P [請參閱本文以獲取解釋](http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-和什麼 - 是 - 他們的收益)。 – dcastro