【问题标题】:Haskell foldl and foldl1 produce "No instance for (Num [Char]) arising from the literal"Haskell foldl 和 foldl1 产生“没有由文字引起的 (Num [Char]) 的实例”
【发布时间】:2019-07-26 05:39:39
【问题描述】:

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


【解决方案1】:

仔细看类型:

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

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

要使用foldl1,请先将show 映射到列表上。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多