Haskell foldl 和 foldl1 产生 "No instance for (Num [Char]) arising from the literal"
Haskell foldl and foldl1 produce "No instance for (Num [Char]) arising from the literal"
我认为这两个折叠功能是一样的,但只有第二个有效。第一个产生 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]
谢谢
如果您查看 foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
的类型签名,您会发现 lambda 必须 return 与列表中的类型相同。这是因为 returned 值随后用于计算下一步。
这不会发生在 foldl
中,因为 lambda 可以 return 任何类型,因为该值仅用作累加器。我没有时间写一个更清晰的答案,只是 google foldl1 来理解其中的区别
仔细看类型:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
在调用函数 之前,需要将值转换为 [Char]
,因为函数需要其参数类型和 return 类型是相同的。 (并且只有第一次使用该函数时才会得到两个相同类型的参数。)
要使用 foldl1
,请先在列表上映射 show
。
foldl1 (++) (map show [12, 23, 45, 66])
我认为这两个折叠功能是一样的,但只有第二个有效。第一个产生 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]
谢谢
如果您查看 foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
的类型签名,您会发现 lambda 必须 return 与列表中的类型相同。这是因为 returned 值随后用于计算下一步。
这不会发生在 foldl
中,因为 lambda 可以 return 任何类型,因为该值仅用作累加器。我没有时间写一个更清晰的答案,只是 google foldl1 来理解其中的区别
仔细看类型:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
在调用函数 之前,需要将值转换为 [Char]
,因为函数需要其参数类型和 return 类型是相同的。 (并且只有第一次使用该函数时才会得到两个相同类型的参数。)
要使用 foldl1
,请先在列表上映射 show
。
foldl1 (++) (map show [12, 23, 45, 66])