2012-05-29 4 views
2

몇 가지 구성 요소로 구성된 응용 프로그램을 개발 중이라고 가정합니다. 이제,의 반환 상태를 나는이 기능은 아마도 구성 요소의 상태를 반환하는 다른 함수를 호출해야Scala에서 간단한 모니터링 라이브러리를 설계하는 방법은 무엇입니까?

case class Status(...) 
def status[A](a:A):Status = {...} // A - data used to calculate the status

응용 프로그램 상태를 반환하는 함수를 작성하고 싶습니다, 그 구성 요소의 기능은 각각 다른 함수를 호출 하위 구성 요소 등등

스칼라에서 어떻게 그러한 라이브러리 라이브러리를 설계하겠습니까? 이 기능은 monad처럼 보이나요?

답변

3

두 가지 방법이 있습니다. 첫 번째는 패턴이 데이터 구조 분해 일치 사용, 그 특성 '합계'는 조금 무서운 보이는 생각 될 수도 이제

// 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 
관련 문제