Haskell foldl和foldl1产生“没有实例(Num [Char])来自字面”

问题描述 投票:1回答:2

我认为这两个折叠函数是相同的,但只有第二个函数有效。第一个产生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]

谢谢

haskell fold foldleft
2个回答
4
投票

仔细看看类型:

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

在调用函数之前,需要将值转换为[Char],因为函数需要其参数的类型和返回类型相同。 (并且只有第一次使用该函数才能获得两个相同类型的参数。)

要使用foldl1,请首先在列表中映射show

foldl1 (++) (map show [12, 23, 45, 66])

3
投票

如果你看一下foldl1 :: Foldable t => (a -> a -> a) -> t a -> a的类型签名,你会发现lambda必须返回与列表中的类型相同的类型。这是因为返回的值然后用于计算下一步。

这在foldl中不会发生,因为lambda可以返回任何类型,因为该值仅用作累加器。我没有时间写一个更清晰的答案,但只是谷歌foldl1来了解差异

© www.soinside.com 2019 - 2024. All rights reserved.