“Left identity” of Monad laws in Haskell is wrong
You should be more precise. When you say that f(x), f a and m &gt;&gt;= f are "the same", that does not make sense as written. f(x) and f a cannot be the same, they do not even use the same variables. Did you mean to compare f(u), f u and u &gt;&gt;= f? It is true that f(u) and f u are the same thing, but u &gt;&gt;= f is not. If f has type a -&gt; m b (where m is the monad) then


in f u the type of u must be a, but
in u &gt;&gt;= f the type of u must be m a


So the types don't even match. Furthermore, if you look at concrete examples, you will see that &gt;&gt;= is not "just notation". It actually does things.

If we now look at the left identity law

return u &gt;&gt;= f  ≣  f u


we see that we cannot just rewrite the left-hand side to f u, or even f (return u). We must take into account what return and &gt;&gt;= do in a specific case. For instance, in the list monad we define

return x = [x]


and

(xs &gt;&gt;= f) = concat (map f xs)


The left identity law holds because of how concat and map work:

return x &gt;&gt;= f      ≣
[x] &gt;&gt;= f           ≣
concat (map f [x])  ≣
concat [f x]        ≣
f x


The above calculation was not just "notation"!