2017-09-10 7 views
1

変更可能なベクター(たとえば、タイプがIOVector a)の場合、要素を変更するマップのような機能はありますか?可変ベクトルのインプレースマップ機能はありますか?

パッケージはmodify機能を提供しますが、これは一度に1つの要素に過ぎません。これを使用すべきか、または好ましい方法があるか?

明確にするために、ベクトルのタイプは前後で同じになります。

答えて

6

いいえ、場所にある要素を変更する場合は、modifyを使用してください。すべての場所を変更することがよくある場合は、mapModifyを以下のように定義することができます。あなたが定期的にfmapを使用して、それらの上に不変ベクトルとのマッピングを使用したほうが良いかもしれように絶えずベクトル内のすべての要素を修正する、と述べた

import Data.Foldable (for_) 
import qualified Data.Vector.Mutable as MV 

mapModify :: (a -> a) -> IOVector a -> IO() 
mapModify f v = for_ [0 .. MV.length v - 1)] (MV.modify v f) 

が鳴ります。そのコードが適切に融合したら、中間ベクトルは決して実体化されません。

+0

私はfusionの使い方に慣れていませんが、不変なベクトルを使うのが最も良い方法かもしれません。 – user668074

+0

@ user668074、このようにすべての要素を実際に変更したくない理由の1つは、怠惰が効率を低下させる可能性があるということです。それをインストールする前にそれぞれの結果を強制的に実行する 'mapModify 'はおそらくもっと便利でしょう。怠惰な純粋なバージョンが他の操作と融合するならば、それは大丈夫かもしれません。 – dfeuer

関連する問題