gpt4 book ai didi

scala - 如何订购密封性状?

转载 作者:行者123 更新时间:2023-12-01 10:45:20 26 4
gpt4 key购买 nike

我有一个由一种“状态机”(“流程图”)定义的分布式系统

每个系统在共享“日志”中写入状态

我将每个状态表示为密封特征的一部分以及该状态的给定“状态”

我想“合并/减少”到代表当前进度的单个状态。

(有一些放松的地方,因为并非所有人都必须成功才能成功完成最终状态)

有 2 个密封特征代表流:

sealed trait System
case object A extends System
case object B extends System
case object C extends System
...

sealed trait Status
case object Pending extends Status
case object InProgress extends Status
case object Success extends Status
case object Fail extends Status

日志:
A, Success
B, Fail
C, Pending
...
...

现在有一组规则可用于定义单个状态减少

基本上它优先
A < B < C, ... < Z

Pending < InProgress < Success < Fail
所以如果有以下状态:
(A, Success)(C, Pending)
我想把它减少到 (C,Pending)
而如果
(A,Success)(B, Fail)
我想把它减少到 (B, Fail)
在我的情况下,我可以将其建模为一个简单的整数比较(可能带有我明确测试的异常值)

我不清楚如何使密封特征具有可比性/可排序性,这将使我的生活更轻松

沿着这些路线的东西就足够了:
def reduce(states: Seq[(System,Status)]) : (System,Status) = {
states.order... {left.system < right.system) && (a.status < b.status) ... possibly another ordering test ....}.tail // take the last one in the ordering
}

最佳答案

您可以定义一个 scala.math.Ordering[Status] :

object StatusOrdering extends Ordering[Status] {
def compare(x: Status, y: Status): Int =
(x, y) match {
// assuming that the ordering is Pending < InProgress < Success < Fail...
case (_, _) if (x eq y) => 0
case (Pending, _) => -1
case (_, Pending) => 1
case (InProgress, _) => -1
case (_, InProgress) => 1
case (Success, _) => -1
case (_, Success) => 1
case _ => 0 // (Fail, Fail)
}

在您的 reduce ,然后你可以
import StatusOrdering.mkOrderingOps

和您的 Status对象将被丰富 <和 friend 。

也可以拥有您的 trait延长 Ordered[Status] ,它定义了特征中的规范排序:
sealed trait OrderedStatus extends Ordered[OrderedStatus] {
def compare(that: OrderedStatus): Int =
(this, that) match {
case (x, y) if (x eq y) => 0
case (Qux, _) => -1
case (_, Qux) => 1
case (Quux, _) => -1
case (_, Quux) => 1
case _ => 0
}
}

case object Qux extends OrderedStatus
case object Quux extends OrderedStatus
case object Quuux extends OrderedStatus

那你就不用导入 mkOrderingOps ,但我个人不喜欢向前使用扩展 case objectscompare方法(在每种情况下,替代样板 compare 对象甚至更糟)。

关于scala - 如何订购密封性状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com