Я реализовал функцию преобразования двоичного кода в десятичную в Haskell и в настоящее время работаю над функцией, которая будет преобразовывать десятичное значение в двоичное. (Я знаю, что эти функции где-то доступны, хотя они не являются частью Prelude.hs)
Я придумал следующий код для процедурного языка C-типа, но у меня возникли проблемы с его адаптацией к функциональной парадигме.
while (n > 0)
{
if (n % 2 == 1)
str = str + "1";
else
str = str + "0";
n = n / 2;
}
Я рискнул заняться функциональным программированием на Haskell совсем недавно, поэтому я совершенно не знаком с функциональным образом мышления. Я попытался сделать это, используя как рекурсию, так и понимание списка, но я не уверен, как правильно разместить охрану и логику, поскольку это включает несколько условий. Я использую список Int
для хранения отдельных двоичных битов.
--Decimal to binary
toBin:: Int -> [Int]
toBin 0 = [0]
toBin n | (n % 2 == 1) =
|(n % 2 == 0) =
Я понял, что приведенный выше шаблон позволит программе выбрать либо защиту, либо окончание оценки функции. Я на неправильном пути здесь?
Ниже я придумал примитивную рекурсию для преобразования любой базы (меньше 10 вместо 2) в десятичную.
toDecimal :: [Int] -> Int
toDecimal [] = 0
toDecimal (x:xs) = (x * 2 ^(length xs)) + bin xs