test :: VM.MVector s Int -> Int
test x = runST $ do
a <- return x
VM.read a 0 -- Type error
Я пытаюсь понять, как не поместить все в монаду ST в одну функцию. Если я попытался изменить x
или вернуть значение из него, компилятор будет жаловаться на состояние части изменяемого вектора, не совпадающего.Как изменить или прочитать измененный вектор, переданный в качестве аргумента в функции?
Может ли работать в переданных изменяемых векторах в Haskell, или я должен заморозить их в неизменяемых коллегах, прежде чем что-либо делать с ними?
Редактировать:
Настоящая ошибка.
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
Редактировать: Следующая проверка типов проходит.
test :: VM.MVector (Control.Monad.Primitive.PrimState IO) Int -> IO (Int)
test x = VM.read x 0
Я предполагаю, что я мог бы мутировать x
вектор а. Итак ...
Не можете добавить ошибку? – Carsten
'a <- return x' является избыточным. Это просто дает вам «x» снова. – melpomene
@Carsten Добавил ошибку. –