:
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
Açıklama: Gördüğünüz gibi, toNum fonksiyonu verilmiş tabanı ve bir eşleme fonksiyonu kullanılarak, onluya bir k tabanlı değerini dönüştürür . haritalama fonksiyonu (örn. A = 10, B = 11, ... hex için) ondalık değere özel karakterleri eşler. İkili eşleme için binToDec'te gördüğünüz gibi bir lambda ifadesi kullanabilirsiniz. toKBaseVal fonksiyonu ise
k tabanlı değerine bir ondalık dönüştürme tersidir.Yine bunun tersi olan bir eşleme fonksiyonuna ihtiyacımız var: bir ondalıktan k temelli değerin karşılık gelen özel karakterine.
bir test olarak yazabilirsiniz: haritalama basittir çünkü sadece bir lambda ifade kullanın, yine
-- decimal to octal
decToOct :: Int -> String
decToOct x = toKBaseNum x 8 (\x -> intToDigit(x))
:
binToDec(decToBin 7) = 7
Eğer sekizlik biçime ondalık dönüştürmek istediğiniz varsayalım: sadece rakamlar.
Bu yardımcı olur umarım! İyi programlama!
Aşağı kaydırmayan benim gibi tembel olan herkes için, printf örneği çok daha özlü ve esnek ve örn. Sabit uzunluklu bir dizi ve diğer tüm printf özelliklerini verir. Bunun yerine, yalnızca: 'printf"% 032b "5' – mozboz
@mozboz, Haskell'de' printf', ciddi kodlarda kullanılan bir işlevden çok bir sihir numarası gibidir. Biçim dizgisi çalışma zamanında ayrıştırılır (çalışma zamanı hataları üretebilir) ve tüm mekanizma biraz yavaştır. – dfeuer
Bu, negatif sayılarla çalışmıyor. – CMCDragonkai