Oi Paulo.
Gostei bastante do post, mas parece que reafirma o que eu falei.
Na seção "Maybe of a Maybe? Maybe not", ele toca no ponto mais importante do uso das mônadas (na minha opinião): a composição de funções que retornam valores monádicos.
Note que quando ele cria a função getProvinceBanner, ele retorna um Maybe do valor. E essa função não é facilmente mapeável, pois você acaba ficando com dois níveis de Maybe (como mostrado no post). Pra resolver isso ele cria os métodos join e chain. O método chain é, exatamente, a implementação do método bind em Haskell. Ele possibilita o encadeamento de funções que retornam valores monádicos em uma mônada só no final.
Além disso, se pensarmos um pouco mais, a existência do método chain, por exemplo, dá o poder de transformar um Maybe de um valor em um Maybe vazio, de acordo com o valor dentro do Maybe. Isso porque o chain recebe um parâmetro e retorna um Maybe.
Agora veja a diferença com o método map, por exemplo: ele recebe um valor de um tipo e retorna outro tipo. A priori (sem o flatMap), não é possível mudar o tipo do Maybe onde o map é chamado (pois se o map retornar um Maybe temos o problema de dois Maybes aninhados, e temos que usar o join).
O ponto que eu levanto, e que o autor no post não endereçou diretamente, é que, sem o método chain ou o método join, não temos, efetivamente, uma mônada: temos apenas um functor, e devemos, manualmente, desembrulhar os valores.
De qualquer forma a discussão foi bastante válida, pois acabei vendo outras páginas pra entender melhor esse assunto.