#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"]
вернется . В случае, если вам нужно работать с переполнением, скорее всего, вам следует использовать рекурсивную функцию.