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!
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 ()]))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With