2011-01-13 25 views
-1
import Data.Char 


blockCode :: S 

lett2num :: Char -> Int 
lett2num y 
    | (or 


num2bin :: Int -> [Int] 
num2bin n: negative number" 
    where n2b 0 = [] 
     n2b n = n `mod` 2 : n2b (n `div` 2) 
+1

如果我正確理解你的二進制編碼,這將是不可能的解碼,因爲它是不明確的。例如,字符串AA和C都將被編碼爲11.您確定這是您想要的嗎? – sepp2k 2011-01-13 16:54:41

+0

em..no。我不想要這個,但我不知道如何以另一種方式做 – Tonja 2011-01-13 16:58:18

回答

1

您可以使用concatMap show轉換列表轉換爲字符串:

Main> num2bin 8 
[0,0,0,1] 
Main> concatMap show $ num2bin 8 
"0001" 

但請注意,你的函數的輸出是相反的。

要盡一切一氣呵成,做

num2bin :: Int -> String 
num2bin n 
    | n >= 0  = concatMap show $ reverse $ n2b n 
    | otherwise = error "num2bin: negative number" 
    where n2b 0 = [] 
     n2b n = n `mod` 2 : n2b (n `div` 2) 
0

功能轉換爲二進制整數:

num2bin :: (Integral a, Show a) => a -> String 
num2bin 0 = "0" 
num2bin 1 = "1" 
num2bin n 
    | n < 0   = error "Negative number" 
    | otherwise  = num2bin (n `div` 2) ++ show (n `mod` 2)