2012-05-29 21 views
2

假設我正在開發一個應用程序,它由幾個組件組成。現在我想編寫一個函數返回的應用現狀如何在Scala中設計一個簡單的監控庫?

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

這個功能可能應該調用其他函數,返回組件的狀態,和每個這樣的組件功能調用等功能,的是返回狀態子組件等等,等等

您會如何在Scala中設計這樣的函數庫?這些功能看起來像是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