【问题标题】:Very basic task using foldr使用 foldr 的非常基本的任务
【发布时间】:2013-08-27 10:32:15
【问题描述】:

我只是在我的 ghci 的一些讲义中使用了一个非常简单的示例:

 foldr (:) [] 1 2

期待结果

   [1,2]

但是,我得到一个错误。每次尝试使用 ++ 或 : 作为给 foldr 的函数时都会出错。

显然我犯了一些非常明显的错误,但我似乎仍然找不到它。

谁能帮忙?

【问题讨论】:

  • 错误信息是什么?你可以:t查看foldr的类型
  • 这应该像foldr (:) [] [1,2]
  • 通常最好包含错误消息,而不仅仅是提及“错误”。这对人们帮助很大:) 即使您接受了包含错误消息的答案,也可以帮助有类似问题的人找到这个问题。

标签: haskell fold


【解决方案1】:

您将foldr 用作可变参数函数,将两个参数12 传递给它,而不是[1, 2]

当你遇到这样的麻烦时,只需检查函数的类型。你可以在 GHCi 中做到这一点:

Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b

所以你看到第一个参数应该是一个函数(a -> b -> b)。您为此使用了(:),这没关系。您也可以检查部分应用函数的类型:

Prelude> :t (:)
(:) :: a -> [a] -> [a]

[a] 替换b 得到:

Prelude> :t foldr (:)
foldr (:) :: [a] -> [a] -> [a]

接下来,您将[] 作为基本案例。

Prelude> :t foldr (:) []
foldr (:) [] :: [a] -> [a]

所以结果函数的类型是[a] -> [a]。你应该怎么做?您必须将列表传递给它才能获得列表!传递参数列表[1, 2]

Prelude> :t foldr (:) [] [1,2]
foldr (:) [] [1,2] :: Num a => [a]

被类型检查器接受并产生结果:

Prelude> foldr (:) [] [1,2]
[1,2]

我希望这有助于对您的程序进行类型调试...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2011-10-16
    相关资源
    最近更新 更多