我有兴趣创建一个循环枚举,其中该类型的第一个和最后一个元素是相邻的。指南针上的基本方向就是这种枚举的一个例子。
data Compass = North | East | South | West deriving (Enum)
枚举函数pred
和succ
将使用Compass
属性声明且易于推理的更新数据的函数。无需为Compass
的每个实例明确定义行为。
data Rotation = CounterClockwise | Clockwise
data Position = Position Compass Integer Integer
rotate :: Position -> Rotation -> Position
rotate (Position c x y) Clockwise = Position (succ c) x y
rotate (Position c x y) CounterClockwise = Position (pred c) x y
问题是Enum
在第一个和最后一个pred
类型被重复调用时succ
或Compass
失败。是否有可能定义一个循环枚举,允许这些函数包装到类型列表的开头或结尾?