Скалас разбивает вычисление на части - PullRequest
2 голосов
/ 14 мая 2010

У меня очень большой List[A] и функция f: List[A] => List[B]. Я хотел бы разделить мой исходный список на подсписки с максимальным размером, по очереди применить функцию к каждому подсписку, а затем unsplit результат в один большой 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?

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

unsplit это просто MA#join, для любого M[M[A]], где M является Monad.

split не существует "из коробки".Ниже описан способ сделать это, чтобы продемонстрировать некоторые концепции Скалаза.Это фактически вызывает переполнение стека в компиляторе в данный момент!

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
1 голос
/ 14 мая 2010

Как насчет этого:

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)
...