
#12620: Allow the user to prevent floating and CSE -------------------------------------+------------------------------------- Reporter: nomeata | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #9520, #8457 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj):
Any thunk of type `Sink` never gets updated.
That's extremely dodgy isn't it? What about {{{ let s1 :: Sink = ... s2 :: Sink = ... x :: Sink = if <expensive> then s1 else s2 }}} If `x` is not updated, but is evaluated more than once, we'll evaluate `<expensive>` more than once. Perhaps you mean something more like this: {{{ data Sink = Await (Maybe Char -o Sink) | Done Int }}} Notice the "`-o`", meaning a "one-shot function". The idea is that one- shot functions are called at most once. (Maybe exactly once, but I think at-most once is better.) So in your `countFrom` example, the continuation `k` would not be floated outside the lambda; and if it was written outside it'd be floated inside the lambda. GHC already has the notion of a one-shot lambda; it's just not dignified as part of the type system. Would that serve? I think that you do intend that the argujment of `Await` is called at most once, don't you? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12620#comment:25 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler