2

我有一个很大List[A]的功能f: List[A] => List[B]。我想将我的原始列表拆分为具有最大大小的子列表,依次将该函数应用于每个子列表,然后将结果拆分为一个大的List[B]. 这很容易:

def split[T](l : List[T], max : Int) : List[List[T]] = //TODO

def unsplit[T](l : List[List[T]]) : List[T] = //TODO

def apply[A, B](l : List[A], f : List[A] => List[B], max : Int) : List[B] = {
  unsplit(split(l, max).map(f(_)))
}

我想知道scalaz是否提供了开箱即用的标准东西?特别是apply方法?

4

2 回答 2

3

unsplit它只是MA#join,对于任何M[M[A]]地方M都是一个Monad

split不存在开箱即用。下面是一轮关于这样做的方式,更多是为了演示一些Scalaz的概念。它实际上触发了编译器中的堆栈溢出!

val ls = List(1, 2, 3, 4, 5)
val n = 5

def truesAndFalses(n: Int): Stream[Boolean] = 
  Stream.continually(true.replicate[Stream](n) |+| false.replicate[Stream](n)).join

val grouped: List[List[Int]] = {
  var zipped: List[(Int, Boolean)] = ls.zip(truesAndFalses(2))
  var groupedWithBools: List[List[(Int, Boolean)]] = zipped splitWith {_._2}
  groupedWithBools ∘∘ {pair: (Int, _) => pair._1}
}

val joined: List[Int] = grouped ∘∘ {_ * 2} join
于 2010-05-14T14:49:13.927 回答
1

这个怎么样:

def split[T](ls: List[T],max: Int): List[List[T]] = ls.grouped(max).toList

def unsplit[T](ls: List[List[T]]): List[T] = ls.flatMap(identity)
于 2010-05-14T10:58:29.340 回答