You cannot go (safely) from Num to Num , since Num does not provide a mechanism for extracting information about a value other than its false equalizer and show mechanisms, but if you are willing to accept a little more from the name of the number you came from, then you can ask for help.
In particular,
fromIntegral :: (Integral a, Num b) => a -> b
and composition
toRational :: Real a => a -> Rational
from
fromRational :: Fractional a => Rational -> a
are good candidates for what you mean, if not quite what you requested.
Bye read . show read . show well-typed and has the signature you are proposing, the value is gobbledigook. There is nothing that says that the text emitted by one instance of Show will be compatible with a completely different instance of Read , and there are many examples of counter examples.
The (implied) Read and Show contract applies only when used with the same type!
source share