Details

Currently, ST actions are instantiated at s = RealWorld when
run. We'd really like to treat ST and IO somewhat differently
for demand analysis, which means we need to have a way to distinguish
them. The most conservative option seems to be to use a differentState# token type.

This commit experimentally (and with a big hammer) adds a newFakeWorld primitive type, a fakeWorld# :: State# FakeWorld
primitive token, and a runFW# (run in a fake world) token.
It then uses runFW# to implement runST. Let's see what happens.

Perhaps, but it requires a tad more work since Core Prep currently doesn't do any substitution in types (which we must do to instantiate State#'s argument) . I think we want to preserve this property, so we would likely need to do something like adding a substitution in the runFW# case in cpeApp.