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])
    

    如果您想看到有趣的东西,请尝试第一个示例,但使用字符串列表而不是数字列表。如果您想看到有趣的东西,请尝试第一个示例,但使用字符串列表而不是数字列表