Вы не можете (разумно) перейти от Num
к Num
, поскольку Num не предоставляет механизма для извлечения информации о значении, которое хранится, кроме его ложных уравнений и шоу-машин, но если вы готовы принять немного больше от имени номера, с которого вы приходите, тогда вы можете обратиться за помощью.
В частности
fromIntegral :: (Integral a, Num b) => a -> b
и состав
toRational :: Real a => a -> Rational
с
fromRational :: Fractional a => Rational -> a
оба являются хорошими кандидатами на то, что вы имеете в виду, если не совсем то, что вы просили.
В то время как read . show
хорошо напечатан и имеет подпись, которую вы предлагаете, значение имеет значение gobbledigook. Ничто не говорит о том, что текст, выданный одним экземпляром Show
, будет совместим с совершенно другим экземпляром Read
, и существует множество встречных примеров.
(подразумеваемый) контракт на Read
и Show
применяется только тогда, когда вы используете их с тем же типом!