だから私は同じように動作するメソッドを作成したい
import Data.Vector as V
import Data.Vector.Mutable as MV
import Control.Monad.ST
type DoubleVec = V.Vector Double
incrAndSwap :: DoubleVec -> Int -> Int -> Int -> DoubleVec
incrAndSwap vec i a b = runST $ do
mvec <- V.thaw vec
oldval <- MV.read mvec i -- 1
MV.write mvec i (val + 1) -- 2
MV.swap mvec a b
V.freeze mvec
しかし、2 つのマークされた行を 1 つの関数に「凝縮」して、次のように言うことができます。
incrAndSwap :: DoubleVec -> Int -> Int -> Int -> DoubleVec
incrAndSwap vec i a b = runST $ do
mvec <- V.thaw vec
incrAt mvec i
MV.swap mvec a b
V.freeze mvec
基本的に、そのincrAt i
関数を書きます。
の型シグネチャをコピーしようとしましたが、型シグネチャでMV.write
動作するものを取得できませんでした。何もコンパイルされません。
これが私の最近の試みです
import Control.Monad.Primitive
type MDoubleVec s = MV.STVector s Double
incrAt :: (PrimMonad m) => MDoubleVec (PrimState m) -> Int -> m ()
incrAt mvec i = MV.write mvec i (val + 1)
where
val = MV.read mvec i -- val is stuck in monad m0
val
しかし、モナドから抜け出す方法がわかりませんm0
。コンパイラによると、どうやらそこにあるようです。これは理にかなっています。
誰も私がこれを行う方法を知っていますか?