Intuition for “run” function of monads
Short answer:

There isn't a run-function for all monads, and its use is evaluating data structures.

Medium answer:

Certain monads build data structures that will be evaluated afterwards. Let's say we want to build our own IO monad (I'll need to use GADT notation, basically I just talk about inhabitants and their specific types):

data SimpleIO a where
  PutStr :: String -&gt; SimpleIO ()
  GetLine :: SimpleIO String
  Bind :: SimpleIO a -&gt; (a -&gt; SimpleIO b) -&gt; SimpleIO b
  Return :: a -&gt; SimpleIO a


Like this, we can build a few IO actions, like one that just reads a string and prints it: Bind GetLine PutStrdoes exactly that.
However, our monad doesn't do anything: We don't know how to execute those actions, so we need some kind of conversion function:

runSimpleIO :: SimpleIO a -&gt; IO a
runSimpleIO (PutStr x) = putStrLn x
runSimpleIO GetLine = getLine
runSimpleIO (Bind x f) = x &gt;&gt;= f
runSimpleIO (Return x) = return x


This is some kind of run function, it uses the monad-made structure to make use of it. It definitely isn't unique though: You might as well write a run function SimpleIO a -&gt; Maybe a. That's nothing defined within the monad, but more of an interpretation.