1

だから私は同じように動作するメソッドを作成したい

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。コンパイラによると、どうやらそこにあるようです。これは理にかなっています。

誰も私がこれを行う方法を知っていますか?

4

1 に答える 1