[Haskell-cafe] Re: rigid variables
Rodney D Price
rodprice at raytheon.com
Thu Jul 20 18:26:31 EDT 2006
Thanks for the responses. The semantics of check as described the
"Data Invariants" paper on STM are really close to what I am looking
for. Unfortunately, that work is not in GHC yet, so I'm attempting my
own poor substitute (below). I have a store that is to be accessed by
other threads, and I want to throw an error under certain conditions.
(The names below are borrowed from the "Scheme in 48 Hours"
tutorial.) In reality I'm looking for an inconsistent store, but for
simplicity's sake I've just put in a standard read operation below.
Is there an easier way?
module Store where
data StoreError = DoesNotExist String
| Default String
instance Error StoreError where
noMsg = Default "Store error"
strMsg = Default
type ThrowsError = Either StoreError
type IOThrowsError = ErrorT StoreError IO
type Store a = TVar [ (String, TVar a) ]
-- read from the store
getSTM :: String -> Store a -> STM (ThrowsError a)
getSTM name store = do
st <- readTVar store
case lookup name st of
Nothing -> return (Left $ DoesNotExist name)
Just rd -> readTVar rd >>= return . Right
get :: String -> Store a -> IOThrowsError a
get name store = do
d <- liftIO $ atomically $ getSTM name store
case d of
Left err -> throwError err
Right d' -> return d'
More information about the Haskell-Cafe