[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