Dear Cafe,<br><br>I can write and use the following,<br><br><span style="font-family: courier new,monospace;">data IntHolder = IntHolder Integer</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">instance Show IntHolder where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    show (IntHolder n) = show n</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">liftInt :: (Integer -&gt; Integer) -&gt; IntHolder -&gt; IntHolder</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">liftInt f (IntHolder c) = IntHolder (f c)</span><br>
<br>But I cannot generalise it to <i>Num:</i><br><br><span style="font-family: courier new,monospace;">data NumHolder = forall a. Num a =&gt; NumHolder a</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">instance Show NumHolder where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    show (NumHolder n) = show n</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">liftNum :: (Num a) =&gt; (a -&gt; a) -&gt; NumHolder -&gt; NumHolder</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">liftNum f (NumHolder c) = NumHolder (f c)</span><br><br>The error message I get is the following:<br><br><span style="font-family: courier new,monospace;">    Couldn&#39;t match expected type `a&#39; against inferred type `a1&#39;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">      `a&#39; is a rigid type variable bound by</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">          the type signature for `liftNum&#39; at Lifts.hs:54:16</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">      `a1&#39; is a rigid type variable bound by</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">           the constructor `NumHolder&#39; at Lifts.hs:55:11</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    In the first argument of `f&#39;, namely `c&#39;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    In the first argument of `NumHolder&#39;, namely `(f c)&#39;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    In the expression: NumHolder (f c)</span><br><br><br>Regards,<br><br clear="all"><br>-- <br>Ozgur Akgun<br>