prism
code:haskell
-- 自然数 -> 整数 の変換は絶対に成功するが,
-- 整数 -> 自然数 の変換はできるとは限らない
nat :: Prism' Integer Natural
nat = prism' nat2int int2nat
where
nat2int :: Natural -> Integer
nat2int = toInteger
int2nat :: Integer -> Maybe Natural
int2nat i =
if i < 0
then Nothing
else Just (fromInteger i)
>> (42 :: Integer) ^? nat
Just 42
>> (-42 :: Integer) ^? nat
Nothing
>> (42 :: Natural) ^. re nat
42 -- :: Integer