Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Created January 10, 2018 15:44
Show Gist options
  • Save AnthonyMikh/40257499fe09aa3d25ecd6da221e8c98 to your computer and use it in GitHub Desktop.
Save AnthonyMikh/40257499fe09aa3d25ecd6da221e8c98 to your computer and use it in GitHub Desktop.
Решение задачи №60 от UniLecs
-- Вспомогательная функция, разделяющая число
-- на младший разряд и все остальные
base10 x = (x `quot` 10, x `rem` 10)
-- Конструирует список из числа
mkListNum x = case base10 x of
(0, digit) -> [digit]
(rest, digit) -> (digit : mkListNum rest)
-- Переводит список обратно в число
unListNum [] = 0
unListNum (x:xs) = x + 10*(unListNum xs)
-- Добавляет число к списку
addDigit num [] = mkListNum num
addDigit num (x:xs) = case base10 (num + x) of
(0, digit) -> (digit : xs)
(rest, digit) -> (digit : addDigit rest xs)
-- Суммирует два списка. В вспомогательной функции
-- sumListNum' первый аргумент содержит перенос
-- от сложения предыдущих цифр
sumListNum = sumListNum' 0 where
sumListNum' acc [] [] = mkListNum acc
sumListNum' acc [] y = addDigit acc y
sumListNum' acc x [] = addDigit acc x
sumListNum' acc (x:xs) (y:ys) =
let (acc', digit) = base10 (acc + x + y)
in
digit : sumListNum' acc' xs ys
main = let l754 = mkListNum 754
l128 = mkListNum 128
listSum = sumListNum l754 l128
in
putStrLn . show . unListNum $ listSum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment