Я ищу пары функцийзадействуя значение (Enum а, Bounded а) => а
previous :: (Enum a, Bounded a) => a -> a
next :: (Enum a, Bounded a) => a -> a
Такое, что previous
является pred :: Enum a => a -> a
, если полученное значение будет ограничен пределами, и цикл это на другую сторону в противном случае (симметрично для next
и succ
).
Пример
data X = A | B | C deriving (Bounded, Enum)
next A = B
next B = C
next C = A
Это было бы легко, если бы я добавить Eq a => a
ограничение, как описано в этих similarquestions. Но это ограничение кажется ненужным, поскольку тип Bounded a => a
для меня звучит так, как будто он должен быть в состоянии определить, находится ли он внутри или нет. В succ
и pred
сами функции имеют некоторый контроль над этим, но я предпочел бы не использовать исключения в моем иначе чистом коде:
Prelude> succ (maxBound :: Int)
*** Exception: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound
Как succ
/pred
испытание против границ, не требуя Eq a => a
(или даже Bounded a => a
)? Могу ли я воспроизвести это поведение в своей собственной функции? Или существует другой способ написать функцию с таким поведением и не требует ограничения Eq
?
'succ' задается некоторой реализацией, которая может определить, действительна она или нет. – Ryan