这可以使用我认为我在Oleg Kiselyov的一篇论文中首次遇到的一个想法,这是一个基础Control.Lens.Equality
.
import Data.Functor.Identity class IsInt a where fromIntF :: f Int -> f a instance IsInt Int where fromIntF fx = fx toIntF :: IsInt a => g a -> g Int toIntF = unf . fromIntF . F $ id newtype F g a b = F {unf :: g b -> a} fromInt :: IsInt a => Int -> a fromInt = runIdentity . fromIntF . Identity toInt :: IsInt a => a -> Int toInt = runIdentity . toIntF . Identity
现在我可以用了
instance IsInt a => Arbitrary (Set a)
并确信我真的在与之打交道Int
.为方便起见,我可以IsInt
使用我需要的任何类来限制类,这Int
是一个实例:
class (Show a, Read a, Integral a, Arbitrary a) => IsInt a where ...