Преобразование базы чисел
есть функция платформы, которая будет делать следующее?
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