【发布时间】:2021-12-06 21:45:23
【问题描述】:
有人可以建议 Haskell span 函数的 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。
【问题讨论】:
-
除了 amalloy 的答案中提出的优秀观点之外,还值得注意的是 Python 和 Haskell 中的列表非常不同。 Haskell 列表是链表,非常适合递归并且非常适合 Haskell。 Python 列表实际上只是顺序数组(类似于 C++ 中的
std::vector或 Java 中的ArrayList),因此如果不每次都复制几乎整个列表,就无法真正获取列表的“尾部”。 Python 程序员很少使用链表,因为它对范式毫无意义。 -
基于数组的列表和惰性不能很好地结合使用,因为这样的列表不是递归数据结构并且本质上是严格的。您需要一个命令式构造(生成器)才能懒惰地构造它。
标签: python haskell functional-programming generator coroutine