<p>I had the same question for a while and was thinking why bother with  <code>a -&gt; m b</code> once mapping <code>a -&gt; b</code> to <code>m a -&gt; m b</code> looks more natural. This is simialr to asking &quot;why we need a monad given the functor&quot;.</p>
<p>The little answer that I give to myself is that <code>a -&gt; m b</code> accounts for side-effects or other complexities that you would not capture with function <code>a -&gt; b</code>.</p>
<p>Even better wording form <a href="https://arxiv.org/ftp/arxiv/papers/1803/1803.10195.pdf" rel="nofollow noreferrer">here</a> (highly recommend):</p>
<blockquote>
<p>monadic value <em>M</em> a can itself be seen as a computation. Monadic functions represent computations that are, in some way, non-standard, i.e. not naturally supported by the programming language. This can mean side effects in a pure functional language or asynchronous execution in an impure functional language. An ordinary function type cannot encode such computations and they are, instead, encoded using a datatype that has the monadic structure.</p>
</blockquote>
<p>I'd put emphasis on <em>ordinary function type cannot encode such computations</em>, where ordinary is  <code>a -&gt; b</code>.</p>
On the signature of >>= Monad operator
<p>This is the signature of the well know >>= operator in Haskell</p>

<pre><code>&gt;&gt;= :: Monad m =&gt; m a -&gt; (a -&gt; m b) -&gt; m b
</code></pre>

<p>The question is why type of the function is </p>

<pre><code>(a -&gt; m b)
</code></pre>

<p>instead of </p>

<pre><code>(a -&gt; b)
</code></pre>

<p>I would say the latter one is more practical because it allows straightforward integration of existing "pure" functions in the monad being defined.</p>

<p>On the contrary, it seems not difficult to write a general "adapter"</p>

<pre><code>adapt :: (Monad m) =&gt; (a -&gt; b) -&gt; (a -&gt; m b)
</code></pre>

<p>but anyway I regard more probable that you already have <code>(a -&gt; b)</code> instead of <code>(a -&gt; m b)</code>.</p>

<p><strong>Note.</strong> I explain what I mean by "pratical" and "probable".
If you haven't defined any monad in a program yet, then, the functions you have are "pure" <code>(a -&gt; b)</code> and you will have 0 functions of the type <code>(a -&gt; m b)</code> just because you have not still defined <code>m</code>. If then you decide to define a monad <code>m</code> it comes the need of having new <code>a -&gt; m b</code> functions defined.</p>