3

Только начал изучать haskell. В задаче требуется вывести двухэлементный кортеж, в котором первый элемент - это сумма цифр числа, а второй - количество цифр в числе. Кое-что написал, но не работает - компилятор выводит много ошибок связанных с типами данных.

sum'n'count x   | x == 0 = (0, 1)
                | otherwise = (a x, b x)
                    where 
                        b x | x < 10 = 1
                            | otherwise = 1 + b (div (x 10))
                        a x | x > 10 = a (div (x 10)) + mod (x 10)  
                            | otherwise = x
  • 1
    div x 10 вместо div (x 10), аналогично с mod. Кроме этого есть небольшая ошибка в функции a – extrn Jul 13 '19 at 15:08
  • @extrn спасибо, все заработало) – Nutinaguti Jul 13 '19 at 15:38

2 Answers2

1

Как и написали в комментариях, ошибка была в лишних скобках для функций mod и div. Такой код будет работать правильно:

sum'n'count :: Integer -> (Integer, Integer)
sum'n'count x   | x == 0 = (0, 1)
                | otherwise = (a x, b x)
                    where 
                        b x | abs x < 10 = 1 
                            | otherwise = 1 + b (div x 10)
                        a x | abs x < 10 = x
                            | otherwise = a (div (abs x) 10) + mod (abs x) 10
0

Ну, я чуть поправил, как смог, так как такой же новичек в программировании) Для вычисления длинны числа использовал замену на 1 и затем сумму. Это позволяет считать и такие тесты: "-001". А для суммы не хватало условия для отрицательных чисел меньше 10, тоже добавил.

sum'n'count x = (sumX x, lengthX x)
   where 
      lengthX x = sum[1|_<-(show (abs x))]
      sumX x | (abs x) < 10 = abs x
             | otherwise    = sumX (div (abs x) 10) + mod (abs x) 10
  • добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав [edit] – aleksandr barakin Mar 22 '22 at 13:44