:: (Coercible s a, Coercible t b) => Iso s t a b package:lens

Data types that are representationally equal are isomorphic. This is only available on GHC 7.8+