我认为这两个折叠功能是相同的,但只有第二个有效。第一个产生No instance for (Num [Char]) arising from the literal ‘12’
错误。为什么第一个会产生此错误?
foldl1 (\x y -> (show x) ++ (show y)) [12,23,45,66]
foldl (\x y -> x ++ (show y)) "" [12,23,45,66]
谢谢
答案 0 :(得分:4)
仔细查看类型:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
在调用该函数之前,需要将值转换为[Char]
,因为该函数希望其参数的类型和返回类型相同。 (并且只有第一次使用该函数时,才会获得两个相同类型的参数。)
要使用foldl1
,请先在列表上映射show
。
foldl1 (++) (map show [12, 23, 45, 66])
答案 1 :(得分:3)
如果查看foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
的类型签名,您会看到lambda必须返回与列表中相同的类型。这是因为该返回值随后被用于计算下一步。
在foldl
中不会发生这种情况,因为lambda可以返回任何类型,因为该值仅用作累加器。我没有时间写一个更清晰的答案,只是用Google foldl1来了解区别