`foldr` 的这个 `++` 实现是如何工作的?
How does this `++` implementation by `foldr` work?
我正在第 9 频道的讲座中学习 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]
和运行他们运行haskell,他们只是产生不同的答案:
> 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
,应用:
到y
和 xs
,这实际上是左侧所做的。我的推理对吗?
IMO,您的推理是正确的 - 视频中有错误:
xs ++ ys = ...
= (++) ys xs = ...
真的应该
xs ++ ys = ...
= (++) xs ys = ...
如果您查看 video, you'll notice that Tom Lokhorst pointed out this error (among several others) 的评论。
我正在第 9 频道的讲座中学习 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]
和运行他们运行haskell,他们只是产生不同的答案:
> 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
,应用:
到y
和 xs
,这实际上是左侧所做的。我的推理对吗?
IMO,您的推理是正确的 - 视频中有错误:
xs ++ ys = ...
= (++) ys xs = ...
真的应该
xs ++ ys = ...
= (++) xs ys = ...
如果您查看 video, you'll notice that Tom Lokhorst pointed out this error (among several others) 的评论。