Python的
怎样才能做到这一点?具体来说,在Python 2.7中如何做到这一点?
编辑:我应该提到,
例如,Haskell的
任何使用
请注意,由于严格性问题,Python的
reduce
是一个左折叠,这意味着它是尾递归的,而且它的用法可以整洁地重写为循环。然而,Python没有内置函数来执行右折叠。由于右折叠最自然地用递归来编写(而Python并不像函数式语言那样喜欢递归),我想编写一个基于生成器的右折叠(foldr
)。怎样才能做到这一点?具体来说,在Python 2.7中如何做到这一点?
编辑:我应该提到,
foldr
的一个好处是,有时你可以在无限列表上进行折叠,而不会冒着吃掉堆栈的风险。我希望看到保留此属性的答案。例如,Haskell的
foldr
对输入和输出都是惰性的,可以允许短路“step”函数处理长/无限输入:foldr (&&) True (repeat False) -- gives False
任何使用
list
/reversed
等操作的Python变体,在输入中使用itertools.repeat(some_value)
时会出现挂起的情况。请注意,由于严格性问题,Python的
reduce
在相同的示例中也会出现问题。reduce(lambda x, y: x and y, itertools.repeat(False), True) # hangs
yield
一个生成器,该生成器yield
另一个生成器,以此类推...如果传递的参数是一个空列表,则yield
初始值...老实说,这听起来有点令人头疼...Python对递归没有问题,只要它的深度合理,但我不完全确定递归和生成器是否能很好地配合使用... - twalbergreduce
是一个左折叠,因此就像Haskell的foldl'
(注意有一个撇号)。是的,foldl
及其变体将无法处理无限列表,这就是为什么某些情况下可能需要使用右折叠。 - Elliot Cameronfoldr
实现为f(x, f(x, f(x, ....)))
,那么所有函数都会立即被求值,即使该函数被定义为def lor(a,b): a or b
,而or
是惰性的,但b
参数不是。 - AChampion