正确实现foldl1

Tin*_*ina -1 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"
Run Code Online (Sandbox Code Playgroud)

那不起作用.我试着编译它的这个版本:

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

我首先想到的是缺少一个结束折叠的案例,并且输入有问题

foldl1 _ [x] = x
foldl1 f (x:xs)  =  foldl (f x) xs
Run Code Online (Sandbox Code Playgroud)

但这也不会奏效.我认为类型问题更深入,但我没有足够的把握Haskell进一步思考.有人可以帮我吗?

sep*_*p2k 6

mFoldl1 f (x:xs)  =  myFoldl1 f x xs
Run Code Online (Sandbox Code Playgroud)

重命名函数时你犯了两个错误:首先你在上面的情况(mFoldl1而不是myFoldl1)的定义中错误拼写了函数名,然后foldl用递归调用替换了原来的调用myFoldl1.

正确的版本是:

myFoldl1 f (x:xs) = foldl f x xs
Run Code Online (Sandbox Code Playgroud)

  • @Tina请不要那样做.如果你重新输入代码(特别是以一种容易出现错别字的方式),你只会通过关注代码中实际不存在的错误来让人们浪费时间(和你的).将来,只要你回到它前面就可以复制并粘贴它所在的机器上的代码(不管怎么说你之前不需要答案,因为它们对你的任何用处都没有用)片剂).无论哪种方式,我都打赌,至少我提到的第二个错误实际上也存在于你的真实代码中.我发布的更正代码肯定有效. (8认同)