2015-11-30 33 views

回答

5

这种操作实质上是sequence

import scalaz.Reader, scalaz.std.list._, scalaz.syntax.traverse._ 

def transpose[E, A](readers: List[Reader[E, A]]): Reader[E, List[A]] = 
    readers.sequenceU 

一般来说,如果MTraverse实例和N是一个单子,你可以用这种方式变换M[N[A]]N[M[A]](见我的回答here一些额外的细节)。

注意sequence不会Seq工作,因为Scalaz没有为Seq提供Traverse实例(虽然它的ListVector等)。你可以自己写,但我建议not doing that

(作为注脚,在UsequenceU这里就结束了仅仅是一个黑客,以帮助Scala的类型推断,见我的博客文章here一些背景的一部分。)

+0

我不知道我可以使用具有2种类型构造函数的monad的'sequence'。谢谢 ! –

+0

'sequenceU'没有预期的返回类型:'G.M [List [G.A]]' –

+0

@YannMoisan你是什么意思?在这种情况下'List'就是'G.A'。 –