Scala Akka类型中具有穷举模式匹配的类型安全状态
我开始与Akka Typed合作,对我的行为进行详尽的模式匹配,这对于每个参与者的面向外部的契约来说都是非常好的。但是,如果参与者是一个状态机,则不同的状态可能具有特定于状态的命令 我可以将特定于状态的命令隐藏为整个命令的私有成员,如下所示: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
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'一样的东西