是否有数组的zipWith函数?

时间:2017-09-10 13:35:16

标签: haskell

我有两个大小相等的数组,我想将它们按元素组合。做这个的最好方式是什么? array包似乎没有提供zipWith等效函数。

我不愿意自己创造自己的功能,因为我能想到这样做的主要方式是使用列表来回转换。我关心速度,我认为这种方式不是最有效的方式。

2 个答案:

答案 0 :(得分:2)

自己煮一个很容易:

zipWithA f xs ys = listArray (bounds xs) [f (xs ! i) (ys ! i) | i <- range (bounds xs)]

答案 1 :(得分:2)

选项1:使用repa。如果您关心它,可能会从并行性中获得一些性能优势。

选项2:只使用bounds获取索引。我建议一般避免列表理解;虽然在这种情况下另一个答案正确地使用了它们,但是养成做正确事情的习惯可能是值得的。

zipWithArr f xs ys = listArray (bounds xs) $ fmap (liftA2 f (xs !) (ys !)) (range (bounds xs))

这有效的原因是Haskell的列表是惰性的,我们通常可以将它们视为控制结构(由于各种优化),尽管我们可以将它们视为容器。此外,GHC每个lambda最多只评估一次表达式,所以一般来说你不必担心这样做会效率低下。

相关问题