Haskell foldl1的正确实施

Haskell foldl1的正确实施,haskell,fold,higher-order-functions,Haskell,Fold,Higher Order Functions,提供了一个 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) =

提供了一个

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的掌握不够深入,无法进一步思考。有人能帮我吗

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

正确的版本是:

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

我也在维基百科中偶然发现了这个错误,并找到了这个条目

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

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 []"

我想这是我的工作。我希望有更优雅的。

更正!上面的方法很有效,但使用foldl调用的原始方法要好得多。 如果字体不能清楚区分“l”和“1”,就会产生混淆!说清楚

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

是显而易见且简单的原创。

定义“不起作用”。您是否遇到编译错误或运行时错误,或者它只是无法终止?您提供的代码在我的GHC上运行得非常好。。。我不确定。我很确定第一段代码是正确的。你还有什么不寻常的事情吗?myFoldl1是什么?你用那个名字发布的东西里什么都没有。您应该包括您编写的实际导致错误的代码,而不是您认为正确复制的代码!你刚刚编辑的帖子不正确。将
foldl1
更改为
foldl
并查看其是否有效。Thx对于您的答案,我已经在其他评论中解释过,我将在另一台机器(平板电脑,我可以快速打字)上发布此问题,并且必须再次编写每一个东西。我试图编辑它,但它总是显示我的原始帖子?@Tina请不要这样做。如果您重新键入代码(尤其是以容易出现打字错误的方式),您只会让人们把注意力集中在代码中实际不存在的错误上,从而浪费时间(和您的时间)。在将来,只要从机器上复制并粘贴代码,一旦你回到它前面,它就打开了(无论如何,在那之前你不需要答案,因为它们在你的平板电脑上对你没有任何用处)。无论如何,我敢打赌,至少我提到的第二个错误实际上也存在于您的真实代码中。我发布的更正代码确实有效。你确定不想编辑原始答案而不是发布新答案吗?