[Haskell] Re: Question for the haskell implementors: Arrays,
unsafePerformIO, runST
John Meacham
john at repetae.net
Tue Feb 21 19:50:54 EST 2006
On Tue, Feb 21, 2006 at 11:04:40PM +0000, Simon Marlow wrote:
> Your drop__ reminds me of GHC's touch#, which is like drop__ in the IO
> monad. We use it to control lifetimes, eg. inside withForeignPtr. You
> could implement drop in terms of touch#:
>
> drop__ a b = case touch# a realworld# of s -> b
Ah, cool. there isn't an optimization that can determine that b is
passed through unchanged is there? some sort of core level points-to
analysis for instance.
> I'm not sure about the other way around. Something like "touch# a s =
> drop__ (a,s) s" looks possible, but is wrong - the compiler can see the
> same s is returned.
Also, drop__ completly disapears when grin is first generated from jhc
core and more grin-level optimizations are done that could loose the
fact a should exist at least as long as s. some sort of grin-level
primitive for touch# would be needed in jhc (or some sort of explicit
region annotations? I have not thought enough about those).
> touch# compiles to no code at all in GHC, which is what you want, but it
> does keep its argument alive as far as the GC is concerned - that
> behaviour isn't necessary (is undesirable?) for drop__.
I would think undesirable. simply because there is no need and one of
drop__s uses is to fine-tune memory management. though, I don't think it
makes a big difference in the examples I gave.
I think perhaps drop__ might be useful enough to standardize on, if not
in haskell' then perhaps as a common convention between ghc and jhc
because it solves a couple issues that have come up on the list before
in a way that is more lightweight than hypothetical PRAGMAs.
I am not attached to the name drop__ BTW, double underscores at the end
of a name in jhc are equivalent in intent to # at the end in ghc, it
just means "this might be special in some way" but if we were to have a
common name, it should be something more descriptive. perhaps `dependingOn` ?
> dependingOn :: a -> b -> a
> dependingOn = flip drop__
>
> f x = ... where
> y = foo (z `dependingOn` x)
John
--
John Meacham - ⑆repetae.net⑆john⑈
More information about the Haskell
mailing list