如何定义循环枚举?

时间:2016-12-10 19:22:29

标签: haskell

我有兴趣创建一个循环枚举,其中该类型的第一个和最后一个元素是相邻的。指南针上的基本方向就是这种枚举的一个例子。

data Compass = North | East | South | West deriving (Enum)

枚举函数predsucc将使用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类型被重复调用时succCompass失败。是否有可能定义一个循环枚举,允许这些函数包装到类型列表的开头或结尾?

0 个答案:

没有答案