Haskell foldl和foldl1生产;没有(Num[Char])的实例由literal";
我认为这两个函数是相同的,但只有第二个起作用。第一个生成的Haskell foldl和foldl1生产;没有(Num[Char])的实例由literal";,haskell,fold,foldleft,Haskell,Fold,Foldleft,我认为这两个函数是相同的,但只有第二个起作用。第一个生成的没有(Num[Char])的实例,该实例是由文本“12”引起的。错误。为什么第一个会产生这种错误 foldl1(\xy->(showx)+(showy))[12,23,45,66] foldl(\xy->x++(showy))”[12,23,45,66] 谢谢如果您查看foldl1::Foldable t=>(a->a->a)->ta->a的类型签名,您将看到lambda必须返回与列表中相同的类型。这是因为返回的值随后用于计算下一步 这在
没有(Num[Char])的实例,该实例是由文本“12”引起的。
错误。为什么第一个会产生这种错误
foldl1(\xy->(showx)+(showy))[12,23,45,66]
foldl(\xy->x++(showy))”[12,23,45,66]
谢谢如果您查看
foldl1::Foldable t=>(a->a->a)->ta->a的类型签名,您将看到lambda必须返回与列表中相同的类型。这是因为返回的值随后用于计算下一步
这在foldl
中不会发生,因为lambda可以返回任何类型,因为该值仅用作累加器。我没有时间写一个更清楚的答案,只需通过谷歌foldl1来理解区别如果你查看foldl1::Foldable t=>(a->a->ta->a
,你会发现lambda必须返回与列表中相同的类型。这是因为返回的值随后用于计算下一步
这在foldl
中不会发生,因为lambda可以返回任何类型,因为该值仅用作累加器。我没有时间写一个更清楚的答案,只需通过谷歌foldl1了解区别仔细查看类型:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
在调用函数之前,需要将值转换为[Char]
,因为函数希望其参数的类型和返回类型相同。(并且只有第一次使用该函数才能获得相同类型的两个参数。)
要使用foldl1
,请首先在列表上方映射show
foldl1 (++) (map show [12, 23, 45, 66])
仔细观察类型:
foldl1 :: Foldable t => (a -> a -> a) -> t a -> a
在调用函数之前,需要将值转换为[Char]
,因为函数希望其参数的类型和返回类型相同。(并且只有第一次使用该函数才能获得相同类型的两个参数。)
要使用foldl1
,请首先在列表上方映射show
foldl1 (++) (map show [12, 23, 45, 66])
如果您想看到有趣的东西,请尝试第一个示例,但使用字符串列表而不是数字列表。如果您想看到有趣的东西,请尝试第一个示例,但使用字符串列表而不是数字列表