是否有平台功能可以执行以下操作?
convertBase :: (Num a, Num b) => Int -> Int -> [a] -> [b]
将数字从基数'a'转换为基数'b',其中每个列表项都是数字中的数字。 例如:
convertBase 2 10 [1,1,0,1] = [1, 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)
一些想法:
以下链接可能对您有所帮助:http://rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell - 非十进制基数/转换