
#15349: fixST is a bit wrong -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: dfeuer Type: bug | Status: merge Priority: normal | Milestone: 8.6.1 Component: Core Libraries | Version: 8.5 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4948 Wiki Page: | -------------------------------------+------------------------------------- Comment (by dfeuer): Let's try to think this lazy thing through a little bit. In the general case, we have something like {{{#!hs runST $ (m >>= \x -> fixST (f x)) >>= g }}} There are lots of possible ways the dependencies could go. `g` may demand a value and/or a state token. Depending on that, `f x` may demand a value and/or a state token. If `f x` does ''not'' end up demanding a state token, then that means it doesn't mutate anything, so it's safe to duplicate its evaluation (but also perfectly fine to ensure that doesn't happen, of course). On the flip side, the `MVar` solution can easily fall apart here; if we read a value from an `MVar`, we have to make sure to run an action to fill it. Furthermore, we can't just stick `MVar` creation into the state thread, because that will demand a state token that we're not allowed to demand. If `f x` demands a state token, then it ''might'' perform mutation, and therefore mustn't be duplicated. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15349#comment:12 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler