Haskell foldl и foldl1 производят «Нет экземпляра для (Num [Char]), возникающего из литерала» - PullRequest
0 голосов
/ 04 марта 2019

Я думаю, что эти две функции сгиба одинаковы, но работает только вторая.Первая выдает ошибку No instance for (Num [Char]) arising from the literal ‘12’.Почему первый выдает эту ошибку?

  1. foldl1 (\x y -> (show x) ++ (show y)) [12,23,45,66]
  2. foldl (\x y -> x ++ (show y)) "" [12,23,45,66]

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Посмотрите внимательно на тип:

foldl1 :: Foldable t => (a -> a -> a) -> t a -> a

Значения необходимо преобразовать в [Char] до , когда вызывается функция, потому что функция ожидает тип своих аргументов итип возврата должен быть одинаковым.(И только при первом использовании функции получаются два аргумента одного типа.)

Чтобы использовать foldl1, отобразите show поверх списка первым.

foldl1 (++) (map show [12, 23, 45, 66])
0 голосов
/ 04 марта 2019

Если вы посмотрите на сигнатуру типа для foldl1 :: Foldable t => (a -> a -> a) -> t a -> a, вы увидите, что лямбда должна возвращать тот же тип, что и в списке.Это потому, что это возвращаемое значение затем используется для вычисления следующего шага.

Этого не происходит в foldl, потому что лямбда может возвращать любой тип, так как это значение используется только в качестве аккумулятора.У меня нет времени, чтобы написать более четкий ответ, но просто Google Foldl1, чтобы понять разницу

...