我正在尋找一種優雅的方式來鏈接從一個共同的基礎類型派生的部分功能。這個想法是,每個部分函數處理類型,使他們成爲很容易的出現了不同類型和有一個共同的包羅萬象的,如果鏈接的部分功能是不確定的:鏈接斯卡拉部分功能的優雅方式
trait Message
trait SysMessage extends Message
trait UserMessage extends Message
case class TextSysMessage(m: String) extends SysMessage
case class TextUserMessage(m: String) extends UserMessage
class Test {
type MessagePF = scala.PartialFunction[Message, String]
type SysMessagePF = scala.PartialFunction[SysMessage, String]
type UserMessagePF = scala.PartialFunction[UserMessage, String]
def getSysMessage: SysMessagePF = {
case sm: TextSysMessage ⇒ s"System message: ${sm.m}"
}
def getUserMessage: UserMessagePF = {
case um: TextUserMessage ⇒ s"User message: ${um.m}"
}
def * : MessagePF = {
case m ⇒ s"Unknown message: $m"
}
// Chained partials fails because `m` is a SysMessage with UserMessage
def handler(m: Message): String = (getSysMessage orElse getUserMessage orElse *)(m)
}
顯然,這種方法並不能編譯。我可以通過這樣的嵌套模式匹配來解決這個問題
def getSysMessage: MessagePF = {
case m: SysMessage ⇒ m match {
case sm: TextSysMessage ⇒ s"System message: ${sm.m}"
}
}
但是然後我失去了處理未知消息的能力。有沒有一些優雅的方式來實現這一目標?
爲什麼不用'Message'作爲輸入類型定義每個'PartialFunction'? – adamwy
這基本上是計劃B .... –
但你怎麼能期望一個部分函數,需要具體的子類型與任意'消息'工作?類似於'def handler(m:Message):String =(getSysMessage)(m)'也不起作用。 – adamwy