這真是個好問題!
您想在任意大小的元素列表上依次運行flatMap
。當你不知道你的列表有多長時間時,你可以用遞歸處理它,或者等價地用摺疊處理它。
scala> def sequence[A](lss: List[List[A]]) = lss.foldRight(List(List[A]())) {
| (m, n) => for (x <- m; xs <- n) yield x :: xs
| }
scala> sequence(List(List(1, 2), List(4, 5), List(7)))
res2: List[List[Int]] = List(List(1, 4, 7), List(1, 5, 7), List(2, 4, 7), List(2
, 5, 7))
(如果你不能找出代碼,不用擔心,學習如何使用Hoogle和steal it from Haskell)
你可以用Scalaz做到這一點(在總體上與F[G[X]]
並開始返回G[F[X]]
,鑑於類型構造G
和F
分別有Traverse
和Applicative
能力。
scala> import scalaz._
import scalaz._
scala> import Scalaz._
import Scalaz._
scala> List(List(1, 2), List(4, 5), List(7)).sequence
res3: List[List[Int]] = List(List(1, 4, 7), List(1, 5, 7), List(2, 4, 7), List(2
, 5, 7))
scala> Seq(some(1), some(2)).sequence
res4: Option[Seq[Int]] = Some(List(1, 2))
scala> Seq(some(1), none[Int]).sequence
res5: Option[Seq[Int]] = None
我認爲這可以通過遞歸,但只有在'f'接受值列表。 –
我希望在沒有這個限制的情況下解決這個問題('f'需要一個標準參數列表或curried)。 – schmmd