将十六进制转换为十进制的 Haskell 程序

haskellserver side programmingprogramming

本教程将帮助我们创建一个 Haskell 程序,该程序可以使用 revers、map 和 fold1 函数将给定的十六进制数转换为十进制数

十六进制到十进制的转换是将数字从十六进制数字系统转换为十进制数字系统的过程。

十六进制数字系统使用 16 作为基数,这意味着该系统中有 16 个唯一符号用于表示数字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F)。另一方面,十进制数系统使用 10 作为基数,使用 0 到 9 的符号表示数字。

算法

  • 步骤 1 - 使用内部函数定义 hexToDecimal 函数,

  • 步骤 2 - 程序执行将从主函数开始。main() 函数完全控制程序。它写为 main = do。在主函数中,使用参数调用 hexToDecimal 函数,并将结果打印到控制台。

  • 步骤 3 - 正在初始化名为"hexStr"的变量。它将保存要转换为相应十进制数的十六进制数。

  • 步骤 4 - 调用函数后,使用"putStrLn"语句将结果十进制数打印到控制台。

示例 1

在此示例中,hexToDecimal 函数首先使用 map toUpper 将十六进制字符串的每个字符转换为大写,然后使用 map digitToInt 将每个字符转换为其等效的十进制值,最后通过将十进制值及其对应乘数的乘积相加来计算十进制表示形式。乘数是使用 iterate (*16) 1 计算的,它生成一个从 1 开始的 16 的幂的无限列表。zipWith (*) 函数用于将每个十进制值乘以其对应的乘数。

import Data.Char (digitToInt, toUpper)

hexToDecimal :: String -> Int
hexToDecimal = sum . zipWith (*) (iterate (*16) 1) . reverse . map digitToInt . map toUpper

main :: IO ()
main = do
   let hexStr = "34"
   putStrLn $ "等效的十进制表示形式为: " ++ show (hexToDecimal hexStr)

输出

等效的十进制表示形式为: 52

示例 2

在此方法中,hexToDecimal 函数首先使用 map toUpper 将十六进制字符串的每个字符转换为大写,然后使用 hexDigitToInt 辅助函数计算十进制表示形式,该函数将每个十六进制数字映射到其等效的十进制值。然后使用 foldl 函数从左到右遍历十进制值列表,并为每个值计算更新的十进制表示形式,方法是将当前值乘以 16 并添加当前十六进制数字的十进制等值。

import Data.Char (digitToInt, toUpper,ord)

hexToDecimal :: String -> Int
hexToDecimal = foldl (\acc x -> acc * 16 + hexDigitToInt x) 0 . map toUpper
   where hexDigitToInt x
          | x >= '0' && x <= '9' = ord x - ord '0'
          | x >= 'A' && x <= 'F' = ord x - ord 'A' + 10

main :: IO ()
main = do
   let hexStr = "34"
   putStrLn $ "等效的十进制表示形式为: " ++ show (hexToDecimal hexStr)

输出

等效的十进制表示形式为: 52

结论

在 Haskell 中,使用 reverse、map 和 fold1 函数将十六进制数转换为十进制数。从十六进制转换为十进制时,每个十六进制数字根据其在数字中的位置乘以 16 的幂。十六进制数的十进制表示形式是通过将每个数字的十进制值相加得出的。


相关文章