Как печатать целочисленные литералы в двоичном или шестнадцатеричном формате в haskell?
как печатать целочисленные литералы в двоичном или шестнадцатеричном формате в haskell?
printBinary 5 => "0101"
printHex 5 => "05"
какие библиотеки/функции позволяют этого?
я наткнулся на числовой модуль и его функцию showIntAtBase, но не смог использовать его правильно.
> :t showIntAtBase
showIntAtBase :: (Integral a) => a -> (Int -> Char) -> a -> String -> String
6 ответов:
цифровой модуль включает в себя несколько функции для отображения интегрального типа на различных базах, в том числе
showIntAtBase
. Вот несколько примеров использования:import Numeric (showHex, showIntAtBase) import Data.Char (intToDigit) putStrLn $ showHex 12 "" -- prints "c" putStrLn $ showIntAtBase 2 intToDigit 12 "" -- prints "1100"
если вы импортируете
Numeric
иData.Char
модули, вы можете сделать это:showIntAtBase 2 intToDigit 10 "" => "1010" showIntAtBase 16 intToDigit 1023 "" => "3ff"
это будет работать для любых баз до 16, так как это все, что
intToDigit
работает. Причина дополнительного пустого строкового аргумента в приведенных выше примерах заключается в том, чтоshowIntAtBase
возвращает функцию типаShowS
, который объединит отображаемое представление в существующую строку.
вы также можете использовать printf пакета printf для форматирования вывода с помощью дескрипторов формата C style:
import Text.Printf main = do let i = 65535 :: Int putStrLn $ printf "The value of %d in hex is: 0x%08x" i i putStrLn $ printf "The html color code would be: #%06X" i putStrLn $ printf "The value of %d in binary is: %b" i i
выход:
значение 65535 в шестнадцатеричном формате: 0x0000ffff
Код цвета html будет: #00FFFF
Значение 65535 в двоичном формате: 1111111111111111
вы можете конвертировать целое число в двоичный файл с помощью чего-то вроде следующего:
decToBin x = reverse $ decToBin' x where decToBin' 0 = [] decToBin' y = let (a,b) = quotRem y 2 in [b] ++ decToBin' a
использование в GHCi:
Prelude> decToBin 10 [1,0,1,0]
вы можете определить свои собственные рекурсивные функции, такие как:
import Data.Char (digitToInt) import Data.Char (intToDigit) -- generic function from base to decimal toNum :: [Char] -> Int -> (Char -> Int) -> Int toNum [] base map = 0 toNum s base map = base * toNum (init(s)) base map + map(last(s)) -- generic function from decimal to base k toKBaseNum :: Int -> Int -> (Int -> Char) -> [Char] toKBaseNum x base map | x < base = [map x] | otherwise = toKBaseNum (x `div` base) base map ++ [map(x `mod` base)] -- mapping function for hex to decimal mapHexToDec :: Char -> Int mapHexToDec x | x == 'A' = 10 | x == 'B' = 11 | x == 'C' = 12 | x == 'D' = 13 | x == 'E' = 14 | x == 'F' = 15 | otherwise = digitToInt(x) :: Int -- map decimal to hex mapDecToHex :: Int -> Char mapDecToHex x | x < 10 = intToDigit(x) | x == 10 = 'A' | x == 11 = 'B' | x == 12 = 'C' | x == 13 = 'D' | x == 14 = 'E' | x == 15 = 'F' -- hex to decimal hexToDec :: String -> Int hexToDec [] = 0 hexToDec s = toNum s 16 mapHexToDec -- binary to decimal binToDec :: String -> Int binToDec [] = 0 binToDec s = toNum s 2 (\x -> if x == '0' then 0 else 1) -- decimal to binary decToBin :: Int -> String decToBin x = toKBaseNum x 2 (\x -> if x == 1 then '1' else '0') -- decimal to hex decToHex :: Int -> String decToHex x = toKBaseNum x 16 mapDecToHex
объяснение: Как вы можете видеть,тонум функция преобразует значение на основе k в десятичное, используя заданную базу и функцию отображения. Функция сопоставления сопоставит специальные символы с десятичным значением (например. A=10, B=11, ... in hex). Для двоичного отображения вы также можете использовать лямбда-выражение, как вы видите в binToDec.
а toKBaseVal