News for hackers. Stuff that matters.
Re:State Monad for the Rest of Us by trealira on Friday August 09, 2024 @02:21PM (#41204170)
"Global configuration as a monad" is represented by the Reader monad, which is basically a wrapper over a function that takes a configuration/environment as a parameter and then returns something. It replaces a read-only global configuration.

This is Haskell, but here's a really simple example.

  -- As an ordinary function:
  foo :: Int -> Bool -> Int
  foo n shouldAdd = if shouldAdd then n + 1 else n - 1

  -- Exactly the same, but using the Reader monad
  foo :: Int -> Reader Bool Int
  foo n = do
    shouldAdd <- ask
    return (if shouldAdd then n + 1 else n - 1)
Here's the same thing, but with a record with one boolean in it:

  -- Config: a record with one boolean in it,
  -- and you access it with a function called `shouldAdd`
  data Config = MkConfig { shouldAdd :: Bool }

  foo :: Int -> Config -> Int
  foo n cfg = if shouldAdd cfg then n + 1 else n - 1

  foo :: Int -> Reader Config Int
  foo n = do
    mustAdd <- asks shouldAdd
    return (if mustAdd then n + 1 else n - 1)
It's basically a way to have implicit read-only parameters. You can call a bunch of functions that take a configuration parameter without having to actually pass the configuration as a parameter explicitly. In an object oriented language, you might use classes for this (if not global variables).

There are no comments on this comment yet.