首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个`++`是如何通过‘`foldr`’实现的?

这个`++`是如何通过‘`foldr`’实现的?
EN

Stack Overflow用户
提问于 2017-03-12 10:15:57
回答 1查看 323关注 0票数 3

我正在学习Haskell在haskell编程从第九频道的讲座。在第七章中,教授使用foldr实现了他自己的foldr算子

代码语言:javascript
复制
(++ ys) = foldr (:) ys

他的推理是

代码语言:javascript
复制
  xs ++ ys = foldr (:) ys xs
= (++) ys xs = foldr (:) ys xs
= (++ ys) = foldr (:) ys

这是黑板

我在这里搞不懂为什么xs ++ ys的功能与(++) ys xs相同。我让xs = [1,2,3]ys = [4,5,6]通过runhaskell运行它们,它们只是产生了不同的答案:

代码语言:javascript
复制
> main = print $ [1,2,3] ++ [4,5,6]
[1,2,3,4,5,6]
> main = print $ foldr (:) [4,5,6] [1,2,3]
[1,2,3,4,5,6]
> main = print $ (++) [4,5,6] [1,2,3] 
[4,5,6,1,2,3]

那么,教授在他的推理中到底是什么意思呢?

顺便说一句,我正试图像以下几个方面那样,自己去诱导:

代码语言:javascript
复制
  xs ++ ys = foldr (:) ys xs
= (++) xs ys = foldr(:) ys xs

方程右边的foldr(:) ys xs表示对于这个Foldable ys中的每个y,将:应用于yxs,这实际上是在左侧所做的。我的推理正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-12 10:22:07

海事组织,你的推理是正确的-视频中有一个错误:

代码语言:javascript
复制
xs ++ ys = ...
= (++) ys xs = ...

真的应该是

代码语言:javascript
复制
xs ++ ys = ...
= (++) xs ys = ...

如果您查看视频的注释,您会注意到这个汤姆·洛霍斯特指出了这个错误(包括其他几个)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42746164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档