Data.Vector.Mutable
PrimMonad
inST s
とIO
モナドのインスタンスが必要なようです。
型クラスは次のように定義されます --
-- | Class of primitive state-transformer monads
class Monad m => PrimMonad m where
-- | State token type
type PrimState m
-- | Execute a primitive operation
primitive :: (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
-- | Expose the internal structure of the monad
internal :: m a -> State# (PrimState m) -> (# State# (PrimState m), a #)
それらはこのように実装されています -
instance PrimMonad IO where
type PrimState IO = RealWorld
primitive = IO
internal (IO p) = p
instance PrimMonad (ST s) where
type PrimState (ST s) = s
primitive = ST
internal (ST p) = p
型クラスの関数が何をすべきか、または実装がどのように機能するかをまったく理解していません。
しかし、私はSTTのためにそれを実装する必要があります( http://hackage.haskell.org/package/STMonadTrans-0.3.1によって与えられたもの)
STT
コンストラクターを持つSTT s m a
私の素朴な試みで、すべてST s
を次のものに置き換えてみましたSTT s m
:
instance Monad m => PrimMonad (STT s m) where
type PrimState (STT s m) = s
primitive = STT
internal (STT p m) = p
しかし、私はこのエラーが発生します:
Not in scope: data constructor `STT'
primitive
andの定義については、プログラム全体ですでに複数回internal
使用しているにもかかわらずSTT
(型コンストラクターとして推測しますが?)。
この型クラスを適切に実装するにはどうすればよいですか?
(私は最終的にこれをとして使用しますSTT s (Rand g) a
)
Control.Monad.ST.Trans.Internal
編集: データ コンストラクターとしてgetにインポートしましSTT
たが、これらは新しいエラーです: (に変更internal (STT s m)
した後internal (STT s)
)
Couldn't match kind `*' against `ArgKind'
Kind incompatibility when matching types:
m0 :: * -> *
(#,#) (ghc-prim:GHC.Prim.State# (PrimState (STT s m))) :: ArgKind
-> (#)
In the expression: STT
In an equation for `primitive': primitive = STT
Couldn't match type `m'
with `(#,#) (ghc-prim:GHC.Prim.State# (PrimState (STT s m)))'
`m' is a rigid type variable bound by
the instance declaration at src/pimc/PIMC.hs:41:16
Expected type: ghc-prim:GHC.Prim.State# (PrimState (STT s m))
-> (# ghc-prim:GHC.Prim.State# (PrimState (STT s m)), a #)
Actual type: ghc-prim:GHC.Prim.State# s -> m (STTRet s a)
In the expression: p
In an equation for `internal': internal (STT p) = p
Couldn't match type `a' with `STTRet s a'
`a' is a rigid type variable bound by
the type signature for
internal :: STT s m a
-> ghc-prim:GHC.Prim.State# (PrimState (STT s m))
-> (# ghc-prim:GHC.Prim.State# (PrimState (STT s m)), a #)
at src/pimc/PIMC.hs:44:3
Expected type: ghc-prim:GHC.Prim.State# (PrimState (STT s m))
-> (# ghc-prim:GHC.Prim.State# (PrimState (STT s m)), a #)
Actual type: ghc-prim:GHC.Prim.State# s -> m (STTRet s a)
In the expression: p
In an equation for `internal': internal (STT p) = p