【发布时间】:2023-03-05 21:48:01
【问题描述】:
我知道您可以将zipWith 和zip 定义为:
zipwith' f xs ys = [f x y | (x,y) <- zip xs ys]
但是没有zip 怎么办?我在某处读到,您可以像这样使用并行列表理解来做到这一点:
zipwith' f xs ys = [f x y | x <- xs | y <- ys]
但您必须在代码顶部添加 {-# LANGUAGE ParallelListComp #-} 才能使其正常工作,因为它是一个扩展。
是否有任何其他方法可以使用列表理解来定义zipWith,最好不使用辅助函数或扩展?
【问题讨论】:
-
我认为不理解 O(n^2) 是不可能的。
-
AFAIK,没有。默认情况下,列表解析使用列表的 monad 实例,特别是
>>=函数,它是使用concatMap实现的。ParallelListCompextension instead desugars[f x y | x <- xs | y <- ys]到[f x y | (x, y) <- zip xs ys],并使用更高级别的zips 以获得更多表达式。 -
@KennyTM 你会如何在 O(n^2) 中做到这一点?
-
[f x y | (x, i) <- zip xs [0..], (y, j) <- zip ys [0..], i == j]应该作为 O(n^2) 算法工作,但它仍然依赖于zip来实现。您可以编写像g [f x y | x <- xs, y <- ys]这样的解决方案,其中g删除您不关心的元素,这也是一个明显较慢的算法,但g必须使用length、take和@ 987654342@,因此这不适用于无限列表(上面的索引解决方案也不会)。 -
@user2108462:使用
(!!)和length。好吧,这可能算作辅助功能...
标签: list haskell list-comprehension