test :: VM.MVector s Int -> Int
test x = runST $ do
a <- return x
VM.read a 0 -- Type error
Ich versuche herauszufinden, wie man nicht alles in eine ST-Monade in einer einzigen Funktion steckt. Wenn ich versuchen würde, x
zu ändern oder einen Wert von ihm zurückzugeben, würde sich der Compiler über den nicht übereinstimmenden Zustandsteil des veränderbaren Vektors beschweren.Wie ändere oder lese ich einen veränderbaren Vektor, der als Argument in einer Funktion übergeben wurde?
Wäre es in Haskell möglich, an veränderbaren Vektoren zu arbeiten, oder muss ich sie in die unveränderlichen Gegenstücke einfrieren, bevor ich etwas daran mache?
Bearbeiten:
Hier ist der eigentliche Fehler.
Couldn't match type `s1' with `s'
`s1' is a rigid type variable bound by
a type expected by the context: ST s1 Int at rjb.hs:17:12
`s' is a rigid type variable bound by
the type signature for test :: VM.MVector s Int -> Int
at rjb.hs:16:11
Expected type: VM.MVector
(Control.Monad.Primitive.PrimState (ST s1)) Int
Actual type: VM.MVector s Int
Relevant bindings include
a :: VM.MVector s Int (bound at rjb.hs:18:5)
x :: VM.MVector s Int (bound at rjb.hs:17:8)
test :: VM.MVector s Int -> Int (bound at rjb.hs:17:3)
In the first argument of `VM.read', namely `a'
In a stmt of a 'do' block: VM.read a 0
Bearbeiten: Die folgende besteht Typüberprüfung.
test :: VM.MVector (Control.Monad.Primitive.PrimState IO) Int -> IO (Int)
test x = VM.read x 0
Ich vermute, dass ich auch die x
Vektor mutieren würde. So ...
können Sie bitte den tatsächlichen Fehler hinzufügen? – Carsten
'a <- return x' ist redundant. Das gibt dir einfach wieder 'x'. – melpomene
@Carsten Der Fehler wurde hinzugefügt. –