2016-11-10 4 views
2

없이 스칼라에서 중첩 된 경우 클래스를 접습니다. 예로는트래버스는/내가 합계 및 제품 유형의 혼합에 대한 몇 가지 사례 수업을 상용구 코드

object Top { 
    def fold[T](accu: T)(f : (T, Leaf) => T)(top: Top) = { 
    val allLeaves = top.container.leaf :: top.middle.left :: top.middle.right :: top.extraLeaves 
    allLeaves.foldLeft(accu)(f) 
    } 

    private def countBadLeaf(count: Int, leaf : Leaf) = leaf match { 
    case BadLeaf => count + 1 
    case _ => count 
    } 

    def countBad(top: Top): Int = fold(0)(countBadLeaf)(top) 

    private def sumGoodLeaf(count: Int, leaf : Leaf) = leaf match { 
    case GoodLeaf(v) => count + v 
    case _ => count 
    } 

    def sumGoodValues(top: Top) = fold(0)(sumGoodLeaf)(top) 
} 

실제 생활 :

  • GoodLeaf의 여기

BadLeaf

  • 합계 모든 값의 발생을 카운트는 작업을 수행하는 코드입니다 구조를 처리하는 것은 내가 만든 예제보다 훨씬 복잡합니다. 많은 상용구 코드 작성을 피할 수있는 기법이 있습니까?

    이미 종속성으로 cats 라이브러리가 있으므로 해당 lib를 사용하는 솔루션이 선호됩니다. 나는이 문제를 해결하기 위해 새로운 의존성을 포함하도록 개방되어있다.

    내 구체적인 예를 들어, 정의는 재귀가 아니지만 재귀 정의에도 사용할 수있는 솔루션을 찾는 데 관심이 있습니다.

  • +1

    *이 작업을 수행하는 코드를 작성하는 방법을 알고 있지만 지루할 것입니다. * 먼저 상용구를 표시하십시오. 그럼 우리가 얘기 할게. – Jubobs

    답변

    1

    당신이 allLeaves와 함께했던 것처럼 당신은 그냥 Top에 대한 모든 잎을 반환하는 함수를 만들 수 있습니다, 그래서 당신은 단지 (스칼라 라이브러리, 고양이 등이 제공하는 모든 fold 기존과 다른 기능)을 List[Leaf] 작업 할 수 있습니다. 예를 들어

    :이 실제 사용 사례에 도움이된다면

    def topLeaves(top: Top): List[Leaf] = 
        top.container.leaf :: top.middle.left :: top.middle.right :: top.extraLeaves 
    
    val isBadLeaf: Leaf => Boolean = { 
        case BadLeaf => true 
        case _  => false 
    } 
    
    val leafValue: Leaf => Int = { 
        case GoodLeaf(v) => v 
        case _   => 0 
    } 
    

    당신은 내가 확실하지 않다

    import cats.implicits._ 
    // or 
    // import cats.instances.int._ 
    // import cats.instances.list._ 
    // import cats.syntax.foldable._ 
    
    val leaves = topLeaves(someTop) 
    
    val badCount = leaves.count(isBadLeaf) 
    val badAndGood = leaves.partition(isBadLeaf) // (List[Leaf], List[Leaf]) 
    val sumLeaves = leaves.foldMap(leafValue) 
    

    로 사용할 수있는? 일반적으로 이질적인 구조 (예 : Top)를 사용하면 어떤 식 으로든 더 균등하게 변환 (예 : List[Leaf] 또는 Tree[Leaf]) 할 수 있습니다.

    재귀 구조가있는 경우 재귀 스키마 (스칼라의 Matryoshka 라이브러리 사용)에 대한 일부 대화를 볼 수 있습니다.