转换进制数

12

是否有平台函数可以执行以下操作?

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

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

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

我希望那样说起来有意义,如果需要澄清什么,请告诉我


你所说的平台函数是指标准库的一部分吗? - j13r
为什么要区分类型ab,它们不都是一些Integral吗? - Frerich Raabe
3个回答

15

使用Hackage的digits软件包:

import Data.Digits (digits, unDigits)

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

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


生成的函数接受整数列表。如果我创建一个 decToBin = convertBase 10 2,那么使用 decToBin [10,10] 是什么意思? - CMCDragonkai
哦,我发现 decToBin [10, 10]decToBin [1010] 是一样的。它只是将列表中的所有数字连接起来。 - CMCDragonkai

8

如果您提供支持大于16进制的“intToDigit”函数,则可以轻松扩展。 - Francesquini

2
一些想法:
  • 使用showIntAtBase或Text.printf将其转换为字符串,并重新转换为不同的基数
  • 自己编写代码 - 当一个基数总是另一个基数的倍数时更容易实现
这里有一个链接可能会对你有所帮助:http://rosettacode.org/wiki/Non-decimal_radices/Convert#Haskell -- 非十进制基数/转换

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接