두 가지 방법이 있습니다. 첫 번째는 패턴이 데이터 구조 분해 일치 사용, 그 특성 '합계'는 조금 무서운 보이는 생각 될 수도 이제
// Just use Boolean for status
type Status = Boolean
trait Statusable
class class A(isOk : Boolean) extends Statusable
class class B(a : A) extends Statusable
class class C(first : B, second : B) extends Statusable
def status(a : Statusable) : Status = a match {
case a : A => a.isOk
case B(a) => status(b.a)
case C(first, second) => status(first) && status(second)
}
status(C(B(A(true)), B(A(false))))
// returns false
status(C(B(A(true)), B(A(true))))
// returns true
을, 당신은 당신의 데이터 클래스가 공통에서 파생 있음을 시행하지 않을 수 있습니다 베이스. 이 경우 유형 클래스가 구조에옵니다.
trait HasStatus[A] { def getStatus(a : A) : Status }
object HasStatus {
def status[A : HasStatus](a : A) = implicitly[HasStatus[A]].getStatus(a)
implicit object AHasStatus extends HasStatus[A] {
def getStatus(a : A) = a.isOk
}
implicit object BHasStatus extends HasStatus[B] {
def getStatus(b : B) = status(b.a)
}
implicit object CHasStatus extends HasStatus[C] {
def getStatus(c : C) = status(c.first) && status(c.second)
}
}
import HasStatus._
status(C(B(A(true)), B(A(false))))
//returns false