2015-11-30 55 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'。 –