2015-11-04 37 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