Scala Akka类型中具有穷举模式匹配的类型安全状态

Scala Akka类型中具有穷举模式匹配的类型安全状态,scala,akka,partialfunction,akka-typed,Scala,Akka,Partialfunction,Akka Typed,我开始与Akka Typed合作,对我的行为进行详尽的模式匹配,这对于每个参与者的面向外部的契约来说都是非常好的。但是,如果参与者是一个状态机,则不同的状态可能具有特定于状态的命令 我可以将特定于状态的命令隐藏为整个命令的私有成员,如下所示: sealed trait Command final case class Add(id: Int) extends Command private final case object AccumulationTimeout extends Command

我开始与Akka Typed合作,对我的行为进行详尽的模式匹配,这对于每个参与者的面向外部的契约来说都是非常好的。但是,如果参与者是一个状态机,则不同的状态可能具有特定于状态的命令

我可以将特定于状态的命令隐藏为整个命令的私有成员,如下所示:

sealed trait Command
final case class Add(id: Int) extends Command
private final case object AccumulationTimeout extends Command
private final case object Ack extends Command
然而,我的两个状态
累积
发射
必须处理彼此的命令。我可以使用
.receivePartial
或包含一个全面的

case _ => Behaviors.unhandled
在这两种情况下,我都丢失了确保正确处理状态的详尽模式匹配

我可以进一步细化命令,如下所示:

sealed trait Command

sealed trait Accumulating extends Command
private final case object AccumulationTimeout extends Accumulating

sealed trait Emitting extends Command
private final case object Ack extends Emitting

final case class Add(id: Int) extends Accumulating with Emitting
有了这一点,我可以定义
行为[累积]
行为[发射]
,这两种行为都是
行为[命令]
,但问题是这两种行为都无法转换为另一种,因为它们都必须返回自己的类型

我尝试了各种排列方式的
。加宽
缩小
,但都无济于事,我意识到我真正需要的是一种将
行为定义为

def receiveMessage[T, V <: T](handler: V => Behavior[T]): Behavior[T] = ???
def receiveMessage[T,V行为[T]):行为[T]=???

其中,
handler
将对窄类型
V
进行详尽的检查,
V
之外的任何消息
T
将返回
行为。未经处理的
。我似乎无法使这些类型实现这样的功能。

一个想法是对特定于状态的属性进行初始匹配命令的子集。类似于:

def累积:行为[命令]=
行为.接收{
案例acc:累积=>
acc比赛{
//…完成消息子类型或编译器失败。。。
}
案例=>
//其他状态子类型包括
行为。未处理

一个想法是对特定于状态的命令子集进行初始匹配。例如:

def累积:行为[命令]=
行为.接收{
案例acc:累积=>
acc比赛{
//…完成消息子类型或编译器失败。。。
}
案例=>
//其他状态子类型包括
行为。未处理

这与我的非类型演员过去的样子非常接近。我希望有一个语法糖,使它比编码模式更明确。我想你可以实现类似于你建议的'V'的东西,它与我的非类型演员过去的样子非常接近。我希望有一个语法糖,使它更清晰显式的,而不是编码模式。我想你可以实现像你建议的'V'一样的东西