如何获取可区分联合(DU)的下一个枚举项 实现机器人方向循环切换
方案1:纯可区分联合 + 模式匹配实现(推荐,可读性最高)
原可区分联合定义不需要修改,直接通过模式匹配穷举所有转向逻辑,天然处理循环边界:
type Direction = North | East | South | West let turnRight current = match current with | North -> East | East -> South | South -> West | West -> North
比如当前方向为South时,第一次调用turnRight得到West,第二次调用直接得到North,不需要额外的边界判断,天然支持循环逻辑。
如果需要支持连续转多次,可以再加个批量处理的函数:
let rec turnRightMultiple times current = if times <= 0 then current else turnRightMultiple (times - 1) (turnRight current)
测试效果:turnRightMultiple 2 South 执行结果就是North,完全符合需求。
方案2:枚举类型 + 模运算实现(代码更简洁)
如果可以调整类型定义,把DU改成带整数映射的枚举类型,用模运算自动处理循环:
// 调整为带整数值的枚举类型 type Direction = | North = 0 | East = 1 | South = 2 | West = 3 let turnRight current = enum<Direction> ((int current + 1) % 4) let turnRightMultiple times current = enum<Direction> ((int current + times) % 4)
测试效果:turnRightMultiple 2 South 计算逻辑为 (2 + 2) % 4 = 0,对应North。
两种方案都不需要额外写边界判断,就能实现方向的自动循环跳转。
内容的提问来源于stack exchange,提问作者Alex_P
相关产品推荐
相关产品推荐

