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.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to