11

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

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

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

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

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

4

3 回答 3

15

使用来自 Hackage的数字包:

import Data.Digits (digits, unDigits)

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

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

于 2012-04-05T12:45:34.340 回答
8

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
于 2012-04-05T12:49:58.587 回答
2

几个想法:

  • 使用 showIntAtBase 或 Text.printf 转换为字符串,并转换回不同的基数
  • 自己写——当一个基数总是另一个基数时更容易

这是一个可能对您有所帮助的链接:http : //rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell -- Non-decimal radices/Convert

于 2012-04-05T12:31:35.683 回答