[Haskell-beginners] Designing complex Haskell programs

Daniel Trstenjak daniel.trstenjak at gmail.com
Fri Jan 3 17:26:21 UTC 2014

Hi Courtney,

On Fri, Jan 03, 2014 at 04:45:08PM +0000, Courtney Robinson wrote:
> I currently can't wrap my head around how to maintain this state. How
> would a more experienced Haskeller approach this problem?

I think that it mostly boils down how your application loop should look
like or which implementation options you have.

If you're able to poll the received data, then you might just have something like:

appLoop :: AppState -> IO ()
appLoop appState = do
   appState' <- pollData appState
   appLoop appState'

You're reading the received data and modifying your state and then
recursive call appLoop.

If you want or have to use callbacks, then one option is to put your
application state into an IORef (a mutable variable), which is shared by
your application loop and your callback code e.g.:

main :: IO ()
main = do
   appRef <- newIORef AppState { ... }
   setWhateverCallback $ \receivedData ->
      modifyIORef appRef $ \appData ->
         -- modify your appData by receivedData

   appLoop appRef

appLoop :: IORef AppState -> IO ()
appLoop appRef = do
   modifyIORef appRef $ \appData ->
      -- do whatever you want with your appData

   appLoop appRef

If you're using multiple threads, then you might want to use
a MVar instead of an IORef.


More information about the Beginners mailing list