Мне нужна была Призма для преобразования Integral a => a
в (Integral b, Bounded b) => b
, гарантируя, что a
действительно вписывается в тип b
. Мое текущее определение (ниже) требует использования ScopedTypeVariables
и является довольно подробным.Призма для преобразования в ограниченный интеграл
Я хотел бы знать, если есть лучше (в идеале уже определены, и я пропустил его) способ проверить, если номер вписывается в тип Bounded
или функции для безопасного преобразования, что я могу использовать построить призму.
Текущее определение:
boundedInt :: forall a b. (Integral a, Integral b, Bounded b) => Prism' a b
boundedInt = prism fromIntegral f where
f n =
if n >= fromIntegral (minBound :: b) && n <= fromIntegral (maxBound :: b)
then Right (fromIntegral n)
else Left n