Ответ 1
Здесь вы можете увидеть код для STRefs: http://haskell.org/ghc/docs/latest/html/libraries/base/src/GHC-STRef.html
Он использует, очевидно, примитивы MutVar#
. Код runST
аналогичным образом использует примитивные и распакованные кортежи RealWorld#
. Однако, учитывая просто IORefs и unsafePerformIO
, вы могли бы создать свою собственную монаду ST
с теми же свойствами большого О, хотя, возможно, и с меньшей эффективностью.