Haskell: map runST
haskell, state-monad
Solution
Each time you run a state transformer with `runST`, it operates on some local state that is separate from all other state transformers. `runST` creates a new state type and calls its argument with that type. So, for example, if you execute
let x = runST (return ())
y = runST (return ())
in (x, y)
then the first `return ()` and second `return ()` will have different types: `ST s1 ()` and `ST s2 ()`, for some unknown types `s1` and `s2` that are created by `runST`.
You are trying to call `runST` with an argument that has state type `s`. That is not the state type that `runST` creates, nor is any other type you can choose. To call `runST`, you must pass an argument that can have any state type. Here is an example:
r1 :: forall s. ST s ()
r1 = return ()
Because `r1` is polymorphic, its state can have any type, including whatever type is selected by `runST`. You can map `runST` over a list of polymorphic `r1`s (with `-XImpredicativeTypes`):
map runST ([r1, r1] :: [forall t. ST t ()])
However, you cannot map `runST` over a list of non-polymorphic `r1`s.
map runST ([r1, r1] :: forall t. [ST t ()]) -- Not polymorphic enough
The type `forall t. [ST t ()]` says that all list elements have state type `t`. But they need to all have independent state types because `runST` is called on each one. That is what the error message means.
If it is okay to give the same state to all list elements, then you can call `runST` once as shown below. The explicit type signature is not required.
runST (sequence ([r1, r1] :: forall t. [ST t ()]))
Problem
I have a binding for a type `[ST s (Int, [Int])]` and I am trying to apply `runST` to each element using map as follows: ``` name :: [ST s (Int, [Int])] --Of Course there is a real value here map runST name ``` This gives me an error message ``` Couldn't match expected type `forall s. ST s b0' with actual type `ST s0 (Int, [Int])' Expected type: [forall s. ST s b0] Actual type: [ST s0 (Int, [Int])] In the second argument of `map', namely `name' In the expression: map runST name ``` There must be something I am misunderstanding. I am aware of runST and function composition, but am unsure if this applies. Thanks for everyones time!