代码之家  ›  专栏  ›  技术社区  ›  oxbow_lakes

scalaz将计算拆分为子部分

  •  2
  • oxbow_lakes  · 技术社区  · 14 年前

    我有一个很大的 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(_)))
    }
    

    我想知道 斯卡拉兹 提供了标准的东西来完成这项工作?尤其是 apply 方法?

    2 回复  |  直到 14 年前
        1
  •  3
  •   retronym    14 年前

    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
    
        2
  •  1
  •   Eastsun    14 年前

    这个怎么样?

    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)