Haskell 换算基数

Haskell 换算基数,haskell,base-conversion,Haskell,Base Conversion,是否有平台功能可以执行以下操作 convertBase :: (Num a, Num b) => Int -> Int -> [a] -> [b] 将数字从基数“a”转换为基数“b”,其中每个列表项都是数字中的一个数字。 例如: convertBase 2 10 [1,1,0,1] = [1, 3] 我希望这是有意义的,如果我能澄清任何问题,请告诉我一些想法: 使用showIntAtBase或Text.printf转换为字符串,然后再转换回其他基 自己写——当一个基

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

convertBase :: (Num a, Num b) => Int -> Int -> [a] -> [b]
将数字从基数“a”转换为基数“b”,其中每个列表项都是数字中的一个数字。 例如:

convertBase 2 10 [1,1,0,1] = [1, 3]
我希望这是有意义的,如果我能澄清任何问题,请告诉我一些想法:

  • 使用showIntAtBase或Text.printf转换为字符串,然后再转换回其他基
  • 自己写——当一个基数总是另一个基数的倍数时更容易
下面是一个可能会帮助您的链接:--非十进制半径/使用Hackage提供的包进行转换

import Data.Digits (digits, unDigits)

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

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

haskell平台中最接近的东西是模块:


fromBase::Int->String->Int
fromBase=fst。头。readInt base((Int->String)
toBase base num=showintBASE intToDigit num“”
fromBaseToBase::Int->Int->String->String
fromBaseToBase from to=从基础到。从基础到

平台函数指的是标准库的一部分?为什么要区分类型
a
b
,它们不只是一些
积分
?生成的函数接受积分列表。如果我创建一个
decToBin=convertBase 10 2
,那么使用
decToBin[10,10]意味着什么
?哦,我发现
decToBin[10,10]
decToBin[1010]
是一样的。它只是将列表中的所有数字串联起来。如果您提供自己的“intToDigit”函数支持基数>16,它很容易扩展
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