
#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 edsko): Replying to [comment:25 simonpj]:
Any thunk of type `Sink` never gets updated. 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?
Typically, yes, but not necessarily. After all, in the minimal example above, ''if'' the exception handler gets executed then the whole process starts over. Ideally it would start over with a newly constructed conduit, but if we cannot prevent sharing, it would start over with the same conduit. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12620#comment:26 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler