yazdım küçük bir program değişken Vector koymak (n) karmaşıklık. Ve O (1) 'de güncelleme ve O (1)' deki erişimi arıyorum. Anlayabildiğim gibi Değişken Vektörler istediğimi yapar. Onları kullanmak için ST veya IO kullanmalıyım. Çünkü bazı UnitTests yapmak istiyorum ST monad tercih ederim, ancak bu vektörü işlev çağrılarında geçmek zorunda kalmak istemiyorum. Monad Transformers kullanmaya devam etmem gerekiyor, çünkü ErrorT ve WriterT gibi transformatörler ekleyeceğim.nasıl Vector ile Devlet Monad kullanarak Ağacında Int tüm değerleri ocurences saymak Haskell Devlet Monad içine
Soru: nasıl Monad Transformers kullanarak Devlet Monad içine Değişken Vector'u koymak için?
import Data.Vector
import Control.Monad.State
import Control.Monad.Identity
import qualified Data.Vector.Mutable as VM
import Control.Monad.ST
import Control.Monad.ST.Trans
type MyMon2 s a = StateT (VM.MVector s Int) (STT s Identity) a
data Tree a = Null | Node (Tree a) a (Tree a) deriving Show
main :: IO()
main = do
print $ runTraverse (Node Null 5 Null)
runTraverse :: Tree Int -> ((),Vector Int)
runTraverse t = runIdentity (Control.Monad.ST.Trans.runST $ do
emp <- VM.replicate 7 0
(_,x) <- (runStateT (traverse t) emp)
v <- Data.Vector.freeze x
return ((), v)
)
traverse :: Tree Int -> MyMon2 s()
traverse Null = return()
traverse (Node l v r) = do
d <- get
a <- (VM.read d v)
VM.write d v (a + 1)
put d
return()
derleme hataları şunlardır:
TranformersExample: line 16, column 16:
Couldn't match type `s'
with `primitive-0.5.2.1:Control.Monad.Primitive.PrimState
(STT s Identity)'
`s' is a rigid type variable bound by
a type expected by the context: STT s Identity ((), Vector Int)
at test/ExecutingTest.hs:15:30
Expected type: STT s Identity (MVector s Int)
Actual type: STT
s
Identity
(MVector
(primitive-0.5.2.1:Control.Monad.Primitive.PrimState
(STT s Identity))
Int)
In the return type of a call of `VM.new'
In a stmt of a 'do' block: emp <- VM.new 7
In the second argument of `($)', namely
`do { emp <- VM.new 7;
(_, x) <- (runStateT (traverse t) emp);
v <- freeze x;
return ((), v) }'
TranformersExample: line 26, column 14:
Couldn't match type `s'
with `primitive-0.5.2.1:Control.Monad.Primitive.PrimState
(StateT (MVector s Int) (STT s Identity))'
`s' is a rigid type variable bound by
the type signature for traverse :: Tree Int -> MyMon2 s()
at test/ExecutingTest.hs:21:13
Expected type: MVector
(primitive-0.5.2.1:Control.Monad.Primitive.PrimState
(StateT (MVector s Int) (STT s Identity)))
Int
Actual type: MVector s Int
In the first argument of `VM.write', namely `d'
In a stmt of a 'do' block: VM.write d v (a + 1)
In the expression:
do { d <- get;
a <- (VM.read d v);
VM.write d v (a + 1);
put d;
.... }
Not:
Ben derleme değil aşağıdaki kodla geldi Yasak kontrol etmiyor farkındayım.
Teşekkürler. Tam olarak ihtiyacım olan şey bu. – user2746253
Bu, STVector'un anlamamı sağladı. –