【发布时间】:2016-05-31 14:39:24
【问题描述】:
对于无限列表,它没有“最后一个”元素。那么foldr 怎么处理呢?
我有来自 Haskell 书中的这段代码 sn-p:
(&&)::Bool->Bool->Bool
True && x = x
False && _ = False
and' :: [Bool]->Bool
and' xs=foldr (Main.&&) True xs
然后在 Prelude 中加载这个 hs 文件并运行:
*Main> and' (repeat False)
False
它按预期工作,但我不明白:
-
(&&)的定义在其左侧接收布尔值, 但是我们应用True && x = x而变量x在它的右侧。 是不是很奇怪? - 为什么
foldr在(&&)返回False时停止? 据我了解,foldr将从尾到头循环遍历列表。 是否有任何内部“中断”机制? -
foldr从列表的最后一个元素开始,但无限列表没有结束。foldr如何开始工作?
【问题讨论】:
-
或者这个:stackoverflow.com/questions/833186/…。无论哪种方式,每个帖子一个问题。您的第一个与您的第二个和第三个不同。第二个和第三个是其他的重复。另外,
foldr不是从右边开始的;它关联到右侧:f a (f b (f c( ... ))))。清理你的问题。 -
您能详细说明您的第一个问题吗?
标签: list haskell infinite fold