gpt4 book ai didi

haskell - `++` 的 `foldr` 实现是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 14:22:07 24 4
gpt4 key购买 nike

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

(++ ys) = foldr (:) ys

他的推理是

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

这是黑板

enter image description here

我很困惑为什么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 中的每个 y ys,将 : 应用于 yxs,这实际上是在左侧所做的。我的推理正确吗?

最佳答案

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

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

应该是

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

如果你看看video的评论,你会注意到 Tom Lokhorst pointed out this error (among several others) .

关于haskell - `++` 的 `foldr` 实现是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42746164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com