Skip to content

Instantly share code, notes, and snippets.

@kbridge
Created February 20, 2024 09:40
Show Gist options
  • Save kbridge/64d01f9160e5689913cd5b60d6bb30e0 to your computer and use it in GitHub Desktop.
Save kbridge/64d01f9160e5689913cd5b60d6bb30e0 to your computer and use it in GitHub Desktop.
demostrate monad transformers and forever
import Control.Monad
import Control.Monad.Trans.Class -- from `transformers`
import Control.Monad.Trans.Maybe -- from `transformers`
import Data.IORef
main :: IO ()
main = do
i <- newIORef (0 :: Int)
void $ runMaybeT $ forever $ do
n <- lift (readIORef i)
if n < 5
then lift $ do
print n
modifyIORef i (+1)
else
MaybeT $ return Nothing
@kbridge
Copy link
Author

kbridge commented Feb 20, 2024

even better, with guard

import Control.Monad
import Control.Monad.Trans.Class -- from `transformers`
import Control.Monad.Trans.Maybe -- from `transformers`
import Data.IORef

main :: IO ()
main = do
  i <- newIORef (0 :: Int)
  void $ runMaybeT $ forever $ do
    n <- lift (readIORef i)
    guard (n < 5)
    lift $ do
      print n
      modifyIORef i (+1)

@kbridge
Copy link
Author

kbridge commented Feb 20, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment