2011-01-13 2 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

+0

em..no. Я не хочу этого, но я не знаю, как это сделать по-другому. – Tonja

+0

Вам придется наносить нулями до определенной предопределенной длины (в зависимости от размера вашего алфавита). –

ответ

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 уже должна содержать то, что преобразует список чисел в числа – Tonja

+0

Затем переименуйте его и поместите 'concatMap' в новую функцию, которую вы называете' num2bin'. Или сверните операцию в код, вплоть до вас. –

+0

num2bin :: Int -> [Int] num2bin 0 = [] num2bin n | n> = 0 = concatMap (reverse (n 'mod' 2: (num2bin (n' div' 2)))) Вы имеете в виду этот путь? – Tonja

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) 
Смежные вопросы