Data.Vector
には、そのベクトルのmaximum
値を返すタイプmaxIndex :: (Ord a) => Vector a -> Int
の関数maxIndex
が含まれています。私は可変ベクトルで作業していますが、MVector
にはmaxIndex
が定義されていません。MVectorのmaxIndex
私は持っているデータを取得する最良の方法は何ですかMVector
私は持っていますか?私のコードは、現在、次のとおりです。
i
import qualified Data.Vector.Unboxed.Mutable as MV
import Control.Monad.ST
import Control.Monad (mapM_)
type MaxIndex = Int
step :: forall s. MV.MVector s Int -> MaxIndex -> ST s()
step vec i = do
n <- MV.unsafeRead vec i
MV.write vec i 0
let l = MV.length vec
(k, x) = n `divMod` l
mapM_ (\j -> MV.modify vec (+k) j) [0..l-1] -- side note, this is just
-- fmap (+k) vec, but MVector is not
-- a functor. Is there a better way?
mapM_ (\j -> MV.modify vec (+1) (j `mod` l)) [i+1..i+x]
は私がstep
の内側に誘導するために探していたインデックスです。私はこれをやっています。なぜなら、ここでの行動は最終的にuntil
の中にラップされ、述語が満たされるまで繰り返され、毎回の凍結と解凍は馬鹿げたほど高価に聞こえるからです。
はい私はそれを参照してください。もし私が書くことができる前に '(安全ではない)Thaw'をもう一度しなければならないのですか? –
安全でない凍結は原則として非常に安く、実際には何もしません。そして、いいえ、モナド計算を再開する前にmax-indexを厳密に評価すれば、何か解凍する必要はないと思います。しかし、より良いテスト&ベンチそれ... – leftaroundabout
@leftaroundabhrm私は、混乱しています。 MVectorが不変の 'Vector'にフリーズするのを確実にしないと' unsafeFreeze'は何をしますか?すでに完了している場合は、どのようにしてメモリ上のその位置に書き込むことができますか? –