假设我正在开发一个应用程序,它由几个组件组成。现在我想写一个函数来返回应用程序状态
案例类状态(...) def status[A](a:A):Status = {...} // A - 用于计算状态的数据
这个函数可能应该调用其他函数,这些函数返回组件的状态,每个组件函数都调用其他函数,返回子组件的状态等等,等等
您将如何在 Scala 中设计此类函数的库?这些函数看起来像monad
吗?
假设我正在开发一个应用程序,它由几个组件组成。现在我想写一个函数来返回应用程序状态
案例类状态(...) def status[A](a:A):Status = {...} // A - 用于计算状态的数据
这个函数可能应该调用其他函数,这些函数返回组件的状态,每个组件函数都调用其他函数,返回子组件的状态等等,等等
您将如何在 Scala 中设计此类函数的库?这些函数看起来像monad
吗?
这里有两种明显的方法。第一个使用模式匹配来分解数据结构:
// 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
现在,您可能会认为该特征“Stat”看起来有点可怕,并且您可能不想强制您的数据类从一个公共基础派生。在这种情况下,类型类来拯救:
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