Consider I was designing a Monopoly game:
data Board = GO | A1 | CC1 | A2 | T1 | R1 | B1 | CH1 | B2 | B3 | JAIL | C1 | U1 | C2 | C3 | R2 | D1 | CC2 | D2 |
With Eq you can check if it's the last element.
Eq
next :: (Eq a, Enum a, Bounded a) => a -> a next = bool minBound <$> succ <*> (/= maxBound)