我有两个大小相等的数组,我想将它们按元素组合。做这个的最好方式是什么? array
包似乎没有提供zipWith
等效函数。
我不愿意自己创造自己的功能,因为我能想到这样做的主要方式是使用列表来回转换。我关心速度,我认为这种方式不是最有效的方式。
答案 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最多只评估一次表达式,所以一般来说你不必担心这样做会效率低下。