Сумма двух списков нового типа

#haskell

Вопрос:

Я создал тип Big Number со следующими функциями

 type Digits = [String] type BigNumber = Digits  scanner :: String-gt;BigNumber scanner a = map (:[]) a  output :: BigNumber -gt; String  output []="" output a = head a    output(tail a)  

Я пытался создать функцию, которая суммирует два больших числа, как это:

 somaBN :: BigNumber -gt; BigNumber -gt; BigNumber somaBN a b = scanner (zipWith ( ) (map read a) (map read b))  

то есть предполагалось бежать вот так:

[1,2,3] [1,2,3]=[2,4,6]

Но я получаю ошибку:

 • No instance for (Num Char) arising from a use of ‘ ’ • In the first argument of ‘zipWith’, namely ‘( )’  In the first argument of ‘scanner’, namely  ‘(zipWith ( ) (map read a) (map read b))’  In the expression: scanner (zipWith ( ) (map read a) (map read b))typecheck(-Wdeferred-type-errors)  

Как я могу это исправить?

Ответ №1:

zipWith ( ) (map read a) (map read b) представляет собой список элементов с типом, который является экземпляром Num класса typeclass. Таким образом , его нет смысла использовать scanner , так как для этого требуется a String .

Таким образом, вы должны преобразовать числа обратно в String s с помощью:

 somaBN :: BigNumber -gt; BigNumber -gt; BigNumber somaBN a b = map … (zipWith ( ) (map read a :: Int) (map read b)) 

где вам нужно заполнить , какая функция преобразует an Int в a String , следовательно , имеет тип … :: Int -gt; String .

Это не позаботится о переполнении. Действительно, если вы используете somaBN ["9"] ["9"] , он вернется ["18"] , а не ["1", "8"] вернется . В случае, если вам нужно работать с переполнением, скорее всего, вам следует использовать рекурсивную функцию.