【问题标题】:Proper implementation of foldl1foldl1 的正确实现
【发布时间】:2016-11-30 17:36:55
【问题描述】:

Haskell Wikibook 提供一个

foldl1           :: (a -> a -> a) -> [a] -> a
foldl1 f (x:xs)  =  foldl f x xs
foldl1 _ []      =  error "Prelude.foldl1: empty list"

那行不通。我试图编译它的这个版本:

myFoldl1           :: (a -> a -> a) -> [a] -> a
mFoldl1 f (x:xs)  =  myFoldl1 f x xs
myFoldl1 _ []      =  error "Prelude.foldl1: empty list

我首先认为它缺少一个结束折叠的案例,并且打字有问题

foldl1 _ [x] = x
foldl1 f (x:xs)  =  foldl (f x) xs

但这也行不通。我认为类型问题更深入,但我对 Haskell 的理解不够好,无法进一步思考。有人可以帮我吗?

【问题讨论】:

  • 定义“不起作用”。您是否收到编译错误或运行时错误,或者它只是无法终止?您提供的代码在我的 GHC 上运行良好。
  • 使用 myFoldl1 我得到一个编译错误“类型错误 - 统一会给出无限类型”
  • 嗯...我不确定。我很确定代码的第一个 sn-p 是正确的。你还有什么不寻常的事情吗?
  • myFoldl1 是什么?你用这个名字发布的内容中没有任何内容。您应该包含您编写的实际导致错误的代码,而不是您认为您复制正确的代码!
  • 您刚刚编辑的帖子不正确。将 foldl1 改回 foldl 看看它是否有效。

标签: haskell fold higher-order-functions


【解决方案1】:
mFoldl1 f (x:xs)  =  myFoldl1 f x xs

您在重命名函数时犯了两个错误:首先,您在上述案例的定义中拼错了函数名称(mFoldl1 而不是myFoldl1),其次您将原来的调用替换为foldl递归调用myFoldl1

正确的版本是:

myFoldl1 f (x:xs) = foldl f x xs

【讨论】:

  • 谢谢你的回答,我已经在其他 cmets 中解释过我在另一台机器(平板电脑,我很快会打错字)上发布这个问题,并且必须再次编写 evrything。我试图编辑它,但它总是显示我原来的帖子?
  • @Tina 请不要那样做。如果您重新键入代码(尤其是以容易出现拼写错误的方式),您只会让人们通过关注实际上不在您的代码中的错误来浪费他们的时间(和您的时间)。将来只需复制并粘贴机器上的代码,一旦您回到它前面(无论如何,在此之前您并不需要答案,因为它们对您没有任何用处药片)。无论哪种方式,我都敢打赌,至少我提到的第二个错误实际上也存在于您的真实代码中。我发布的更正代码肯定有效。
【解决方案2】:

我也偶然发现了wikibook中的错误,并找到了这个条目。

上面的答案似乎是错误的:它们甚至都不是正确的类型。

foldl1 f [x]       = x
fold11 f [x,y]     = f x y
foldl1 f x:y:zs    = f (f x y) (foldl1 f zs)
foldl1 _ []        = error "foldl1 undefined on []"

我认为可以完成这项工作。我希望有更优雅的东西。

【讨论】:

    【解决方案3】:

    更正!上面的作品,但原来使用 foldl 调用要好得多。 混淆是由于字体不能清楚地区分“l”和“1”!说清楚

    fold1 f (x:xs) = foldl f x xs
    

    是明显而简单的原件。

    【讨论】:

    • 您确定不想编辑原始答案而不是发布新答案吗?
    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 2010-10-15
    • 2018-02-10
    • 2011-10-18
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多