John Meacham wrote:
On Tue, Feb 21, 2006 at 10:15:59AM +0000, Malcolm Wallace wrote:

John Meacham <[EMAIL PROTECTED]> wrote:


I generalized this primitive to
drop__ :: a -> b -> b

Also known in the Prelude as "const"...


well, 'flip const' but yes.


The difference is that you propose it be primitive, with the intention
that a clever compiler should not be able to bypass it by inlining its
definition and propagating the loss of the first argument outwards.


sure, well whatever is required on a given compiler to ensure it has the
above qualities, which might mean making it a primitive or have it have
some compiler-specific pragmas attached.

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

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.

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__.

Cheers,
        Simon
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to