2010-05-14 4 views
2

매우 커서 List[A]이고 함수는 f: List[A] => List[B]입니다. 내 원래 목록을 최대 크기의 하위 목록으로 분할하고 차례로 각 하위 목록에 함수를 적용한 다음 을 분할하지 않은의 결과를 하나의 큰 List[B]으로 만듭니다. 이 아주 쉽게 :계산을 하위 부품으로 분할하는 Scalaz

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 방법? 이것에 대해

답변

3

unsplit.

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 
+0

문제는 내 f가'M [A] => M [B]'이다 : 나는 scalaz에서 그걸 도울 수있는 어떤 것도 보지 못한다. (나는'A => M [B] ','M [A => B]'등) –

+0

'val f :리스트 [A] =>리스트 [B] = ...; (그룹화 된 맵 f 조인) : List [B]' – retronym

1

방법 : MMonad 어떤 M[M[A]]에 대한

그것은 단지 MA#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) 
+0

글쎄, erm, 예. 나는 그것이 쉬웠다 고 말했다 - Scalaz가 이것을 (아마도 다른 모나드보다 일반화 된) 박스 밖으로 만들 수있는 것이 있는지 물었다. –

+0

ls.grouped (최대)는 split (ls, max)처럼 간결하다. –

관련 문제