Сумма элементов двух списков int

#haskell

Вопрос:

Я создал новый тип

 type Digits = [String] type BigNumber = Digits  

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

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

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

 Couldn't match type ‘(a0 -gt; b0 -gt; c0) -gt; [a0] -gt; [b0] -gt; [c0]’  with ‘[String]’  Expected type: BigNumber  Actual type: (a0 -gt; b0 -gt; c0) -gt; [a0] -gt; [b0] -gt; [c0]  • Probable cause: ‘( )’ is applied to too few arguments  In the expression: zipWith   (map (read a)) (map (read b))  In an equation for ‘somaBN’:  somaBN a b = zipWith   (map (read a)) (map (read b))typecheck(-Wdeferred-type-errors)   • Couldn't match expected type ‘(a0 -gt; b0 -gt; c0)  -gt; [a0] -gt; [b0] -gt; [c0]’  with actual type ‘[b1]’ • Possible cause: ‘map’ is applied to too many arguments  In the second argument of ‘( )’, namely  ‘(map (read a)) (map (read b))’  In the expression: zipWith   (map (read a)) (map (read b))  In an equation for ‘somaBN’:  somaBN a b = zipWith   (map (read a)) (map (read b))typecheck(-Wdeferred-type-errors)  

Комментарии:

1. Поскольку Digits = [String] вам нужно преобразовать сумму по элементам обратно в список String s.

2. о чем ( ) это ? Поскольку это оператор инфикса, я думаю, вам нужно заключить его в фигурные скобки, чтобы передать его другим функциям.

3. zipWith (map (read a)) (map (read b)) анализирует как ( zipWith ) ( ... ) , а это не то, что вы хотите. Попробуй zipWith ( ) (map ...) (map ...) . Это не решит всех проблем, но это первый шаг.

Ответ №1:

Поскольку функции могут передаваться другим функциям, а некоторые функции традиционно записываются инфиксом, Haskell нуждается в способе отличить программу «добавить x и y » от программы «вызов x с функцией добавления и y в качестве параметров». Без специального синтаксиса одним из способов дифференциации было бы всегда использовать функции с инфиксом в качестве инфикса и требовать, чтобы программист расширил их в лямбду, если они хотели передать ее в качестве аргумента:

 x   y -- add x and y x (a b -gt; a   b) y -- pass   as an argument to x  

Это достаточно распространенная потребность, и это решение достаточно неуклюжее, чтобы использовать специальный синтаксис. Заключение оператора в круглые скобки исключает его инфиксность:

 x ( ) y -- pass   as an argument to x