Scalaz分裂计算成子部分
-
26-09-2019 - |
题
我有一个非常大的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
方法?
解决方案
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
其他提示
这样如何:
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)
不隶属于 StackOverflow