
Aside from Neil's point about rank-2 polymorphism, you can of course just
parameterise your NumHolder type...
data Num a => NumHolder a = NumHolder a
instance Show a => Show NumHolder a where
show (NumHolder x) = show x
instance Functor NumHolder where
fmap f (NumHolder a) = NumHolder (f a)
It depends what you want to do with your NumHolder though. What is the
purpose of this type?
Bob
On Fri, Jan 22, 2010 at 11:31 AM, Ozgur Akgun
Dear Cafe,
I can write and use the following,
data IntHolder = IntHolder Integer
instance Show IntHolder where show (IntHolder n) = show n
liftInt :: (Integer -> Integer) -> IntHolder -> IntHolder liftInt f (IntHolder c) = IntHolder (f c)
But I cannot generalise it to *Num:*
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 error message I get is the following:
Couldn't match expected type `a' against inferred type `a1' `a' is a rigid type variable bound by the type signature for `liftNum' at Lifts.hs:54:16 `a1' is a rigid type variable bound by the constructor `NumHolder' at Lifts.hs:55:11 In the first argument of `f', namely `c' In the first argument of `NumHolder', namely `(f c)' In the expression: NumHolder (f c)
Regards,
-- Ozgur Akgun
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe