如何在 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)

现在我想改变一个细节。我想在 IdleMoving 时赋予 Turn 能力。在 Turn 命令之后,我希望机器保留它所处的任何状态。例如,如果一台机器正在移动并转弯,我希望状态机保留该信息。

例如Start ~> Turn(West)应该是Command[Idle,Moving] & Start ~> Stop ~> Turn(West)应该是Command[Idle,Idle]

我通过向 Turn 命令添加一个类型参数来解决它