Lazy 递归 Haskell's 'span' in Python



有人可以建议Haskellspan函数的Python实现吗?

span :: (a -> Bool) -> [a] -> ([a],[a]) 
span p [] = ([],[]) 
span p (x:xs) = if p x then (x:ys,zs)
else ([],x:xs) 
where (ys,zs) = span p xs

我希望它在每个参数中都是懒惰的,所以一个包含两个生成器的列表。我更希望它是递归实现的,以获得在列表尾部递归的Python定义的感觉。如果合适的话,可以使用yield from

我希望它在每个参数中都是懒惰的,所以一个包含两个生成器的列表。

你不能这么做。生成器和惰性列表之间有一个很大的区别:后者是缓存的,所以您可以重用它的值。在这种情况下,考虑Haskell实现,其中(xs, ys)span f zs的结果。当你第一次看到xs时,你需要通过这个列表,这将触发对span f zs的更多评估……最后,在xsys的末尾发现了更多的东西。你不能在生成器中这样做,因为从其中一个读取会影响另一个。

我将在回答Lazy partition-by中详细讨论这个问题。

相关内容

  • 没有找到相关文章

最新更新