문제

나는 수집하고 싶지도 새로운 컬렉션은,그러나 각각의 결과 값 값에 따라 달라집하기 전에는 어떤 방법으로 그것.내가 해결할 수 있는 이와 leftFold

val result:List[B] = (myList:List[A]).foldLeft(C -> List.empty[B]){ 
  case ((c, list), a) =>
    ..some function returning something like..
    C -> (B :: list)
} 

여기서 문제가 필요한 반복을 통해 전체 목록을 검색 결과 목록입니다.내가 원하는 기능도 TraversableOnce[A]를 TraversableOnce[B]를 만 평가 회원으로 내가 그들에게 전화?그것이 상당히 기존의 문제는 그렇게 임금이 있으면 일반적인 접근 방식이다.내가 무엇을 현재가 있다:

implicit class TraversableOnceEx[T](val self : TraversableOnce[T]) extends AnyVal {

   def foldyMappyFunction[A, U](a:A)(func:(A,T) => (A,U)):TraversableOnce[U] = {
     var currentA = a
     self.map { t =>
        val result = func(currentA, t)
        currentA = result._1
        result._2
     }
   } 
}

지금까지 기능으로 순도가 당신을 실행할 수 없에서 병렬하지만,그렇지 않으면 그렇습니다.

예 것;환 각 요소는 경우 그것은 처음 요소로 등장했다.

val elements:TraversableOnce[E]
val result = elements.mappyFoldyFunction(Set.empty[E]) {
 (s, e) => (s + e) -> (e -> s.contains(e))
}
result:TraversableOnce[(E,Boolean)]
도움이 되었습니까?

해결책

당신은 주 모나드를 사용할 수 있습니다. Scalaz를 사용하여 다시 작성한 예는 다음과 같습니다.

import scalaz._, Scalaz._

def foldyMappy(i: Int) = State[Set[Int], (Int, Boolean)](s => (s + i, (i, s contains(i))))

val r = List(1, 2, 3, 3, 6).traverseS(foldyMappy)(Set.empty[Int])._2

//List((1,false), (2,false), (3,false), (3,true), (6,false))
println(r)

다른 팁

당신이 필요한 것 같습니다 Seqview. 사용 view 또는 view(from: Int, until: Int) 목록의 비 강력한보기를 만드는 방법.

정말 이해하지 못하는 예로 포함되어 확인이 항상 결과 false.

foldLeft 은 다릅니다.그것이 결과에 하나의 가치를 집계하여 모든 요소의 목록에 있습니다.당신은 분명히 필요 map (List => List).

어쨌든,당신의 질문에 대답에 대해 게으름:당신이 사용해야 한다 StreamList. Stream 지 않을 평가 꼬리를 실제로 전에 호출.

스트림 API

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top