Преобразование базы чисел

есть функция платформы, которая будет делать следующее?

convertBase :: (Num a, Num b) => Int -> Int -> [a] -> [b]

преобразовать число из базы " a "в базу "b", где каждый элемент списка является цифрой в числе. например:

convertBase 2 10 [1,1,0,1] = [1, 3]

Я надеюсь, что имеет смысл, дайте мне знать, если я могу что-нибудь прояснить

3 ответов


С помощью цифры пакет от Hackage:

import Data.Digits (digits, unDigits)

convertBase :: Integral a => a -> a -> [a] -> [a]
convertBase from to = digits to . unDigits from

вы можете добавить fromIntegral там, если вам нужно, чтобы типы ввода и вывода были разными. Кроме того,Integral ограничение имеет больше смысла, чем Num, поскольку вы, вероятно, не хотите иметь дело со сложными цифрами или цифрами с плавающей запятой.


самая близкая вещь в платформе haskell от модуля цифровой:

readInt :: Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
showIntAtBase :: Integral a => a -> (Int -> Char) -> a -> ShowS

fromBase :: Int -> String -> Int
fromBase base = fst . head . readInt base ((<base).digitToInt) digitToInt

toBase :: Int -> Int -> String
toBase base num = showIntAtBase base intToDigit num ""

fromBaseToBase :: Int -> Int -> String -> String
fromBaseToBase from to = toBase to . fromBase from

пара идей:

  • используйте showIntAtBase или текст.printf для преобразования в строку и преобразования обратно в другую базу
  • напишите сами -- проще, когда одна база всегда кратна другой

вот ссылка, которая может вам помочь:http://rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell -- non-decimal radices/Convert