繁体   English   中英

这个由`foldr`实现的`++`是如何工作的?

[英]How does this `++` implementation by `foldr` work?

我正在通过Channel 9 Lectures的haskell编程来学习Haskell。 在第7章中,教授使用foldr实现了他自己的++运算符

(++ ys) = foldr (:) ys

他的推理是

  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运行它们,它们只产生不同的答案:

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

那么教授在他的推理中究竟是什么意思呢?

顺便说一句,我试图像以下一样自己诱导:

  xs ++ ys = foldr (:) ys xs
= (++) xs ys = foldr(:) ys xs

在等式的右边部分, foldr(:) ys xs表示对于这个Foldable ys每个y ,应用: yxs ,这实际上是在左侧完成的。 我的推理是对的吗?

IMO,你的推理是正确的 - 视频中有错误:

xs ++ ys = ...
= (++) ys xs = ...

应该真的

xs ++ ys = ...
= (++) xs ys = ...

如果您查看视频的评论,您会注意到Tom Lokhorst指出了这个错误(其他几个)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM