7

Data.Vector.MutablePrimMonadinST sIOモナドのインスタンスが必要なようです。

型クラスは次のように定義されます --

-- | 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'

primitiveandの定義については、プログラム全体ですでに複数回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
4

1 に答える 1