转换数字基数

时间:2012-04-05 12:02:38

标签: haskell base-conversion

是否有平台功能可以执行以下操作?

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

将数字从基数'a'转换为基数'b',其中每个列表项都是数字中的数字。 例如:

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

我希望这是有道理的,让我知道我是否可以清除任何内容

3 个答案:

答案 0 :(得分:14)

使用Hackage中的digits包:

import Data.Digits (digits, unDigits)

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

如果您需要输入和输出类型不同,可以在其中添加fromIntegral。此外,Integral约束比Num更有意义,因为您可能不想处理复杂或浮点数字。

答案 1 :(得分:7)

haskell平台中最接近的是来自模块Numeric

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

答案 2 :(得分:2)

一些想法:

  • 使用showIntAtBase或Text.printf转换为字符串,然后转换回不同的基础
  • 自己写 - 当一个基地总是另一个基数的倍数时,会更容易。

以下链接可能对您有所帮助:http://rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell - 非十进制基数/转换