如何在 GADT 中表示这个 FSM
How to represent this FSM in GADT
我正在观看 this 视频并了解了 Scala 中的 GADT。
我能够表示下面的状态机
这是我的代码
type Idle
type Moving
enum Direction:
case East, West, North, South
import Direction.*
enum Command[From, To]:
case Turn(direction: Direction) extends Command[Idle, Idle]
case Start extends Command[Idle, Moving]
case Stop extends Command[Moving, Idle]
case Chain[A, B, C](command1: Command[A, B], command2: Command[B, C])
extends Command[A, C]
import Command.*
extension [A, B, C](command1: Command[A, B])
infix def ~>(command2: Command[B, C]): Command[A, C] =
Chain(command1, command2)
现在我想改变一个细节。我想在 Idle
和 Moving
时赋予 Turn
能力。在 Turn
命令之后,我希望机器保留它所处的任何状态。例如,如果一台机器正在移动并转弯,我希望状态机保留该信息。
例如Start ~> Turn(West)
应该是Command[Idle,Moving]
& Start ~> Stop ~> Turn(West)
应该是Command[Idle,Idle]
我通过向 Turn
命令添加一个类型参数来解决它
我正在观看 this 视频并了解了 Scala 中的 GADT。
我能够表示下面的状态机
这是我的代码
type Idle
type Moving
enum Direction:
case East, West, North, South
import Direction.*
enum Command[From, To]:
case Turn(direction: Direction) extends Command[Idle, Idle]
case Start extends Command[Idle, Moving]
case Stop extends Command[Moving, Idle]
case Chain[A, B, C](command1: Command[A, B], command2: Command[B, C])
extends Command[A, C]
import Command.*
extension [A, B, C](command1: Command[A, B])
infix def ~>(command2: Command[B, C]): Command[A, C] =
Chain(command1, command2)
现在我想改变一个细节。我想在 Idle
和 Moving
时赋予 Turn
能力。在 Turn
命令之后,我希望机器保留它所处的任何状态。例如,如果一台机器正在移动并转弯,我希望状态机保留该信息。
例如Start ~> Turn(West)
应该是Command[Idle,Moving]
& Start ~> Stop ~> Turn(West)
应该是Command[Idle,Idle]
我通过向 Turn
命令添加一个类型参数来解决它