Вопрос по haskell, base-conversion – Преобразование числовой базы

7

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

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

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

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

I hope that makes sense, let me know if i can clear anything up

под функцией платформы вы подразумеваете часть стандартных библиотек? j13r
Почему различают типыa а такжеbне они просто некоторыеIntegral? Frerich Raabe
или даже на взлом user181351

Ваш Ответ

3   ответа
14

С использованиемцифры пакет от Hackage:

import Data.Digits (digits, unDigits)

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

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

О, я узнал, чтоdecToBin [10, 10] такой же какdecToBin [1010], Он просто объединяет все числа в списке.
Полученная функция принимает список интегралов. Если я создамdecToBin = convertBase 10 2что значит использоватьdecToBin [10,10]?
7

Самая близкая вещь в платформе 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
Я хочу добавить, что это работает только до базы 16
Что легко расширяемо, если вы предоставите свой собственный "intToDigit" базы поддержки функций & gt; 16
2

Пара идей:

  • use showIntAtBase or Text.printf to convert to a string, and convert back to a different base
  • write it yourself -- easier when one base is always a multiple of the other

Вот ссылка, которая может вам помочь:http://rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell - Недесятичные радиусы / Конвертировать

Похожие вопросы