#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