[Haskell-cafe] Caching the Result of a Transaction?

Jake Mcarthur jake.mcarthur at gmail.com
Sun Apr 27 11:12:04 EDT 2008


On Apr 27, 2008, at 10:05 AM, Jake Mcarthur wrote:

> On Apr 27, 2008, at 9:36 AM, Conal Elliott wrote:
>
>> I think we *do* want unsafeNewEmptyTMVar inlined.  Here's a  
>> convenient caching wrapper:
>>
>>    cached :: STM a -> TIVal a
>>    cached m = TIVal m (unsafePerformIO newEmptyTMVarIO)
>
> Yes, this is essentially what I am working with in Reaction at the  
> moment.

Actually, that is not quite what I have been doing. Here is what I had:

     cachedFuture :: STM (a, Time) -> Future a
     cachedFuture stm = unsafePerformIO $ return . Future stm =<<  
newEmptyTMVarIO
     {-# NOINLINE cachedFuture #-}

(Clearly I am skipping right past an implementation of TIVals, despite  
the fact that they may be useful as a separate abstraction. This is  
just laziness.)

If I replace the above with...

     cachedFuture :: STM (a, Time) -> Future a
     cachedFuture stm = Future stm (unsafePerformIO newEmptyTMVarIO)

then my test program hangs, with or without the NOINLINE pragma. I  
can't guess why because, like I already said, I haven't yet thought  
all the way through the relationship between unsafePerformIO and  
NOINLINE.

- Jake


More information about the Haskell-Cafe mailing list