有人可以建议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
的更多评估……最后,在xs
和ys
的末尾发现了更多的东西。你不能在生成器中这样做,因为从其中一个读取会影响另一个。
我将在回答Lazy partition-by中详细讨论这个问题。