
Ozgur Akgun wrote:
data NumHolder = forall a. Num a => NumHolder a
instance Show NumHolder where show (NumHolder n) = show n
liftNum :: (Num a) => (a -> a) -> NumHolder -> NumHolder liftNum f (NumHolder c) = NumHolder (f c)
The problem here is that you declare that liftNum will work for any single type a, decided (effectively) by the caller of the function. But if the caller chooses Int for a, and your NumHolder has a Float inside it, that isn't going to work. You need to take a function that will work for any Num type a: liftNum :: (forall a. Num a => a -> a) -> NumHolder -> NumHolder liftNum f (NumHolder c) = NumHolder (f c) This uses Rank2Types, but that's necessary for what you want. By moving the forall from being implicit at the start of the signature to inside the brackets, you declare that this is a function that works for all types a (that are a member of type-class Num). This should compile and work as you wanted. Neil.