Monadなんてコンパイラが副作用検出できるように構文解釈変えただけじゃん
実態は、命令型コードそのもの
プログラマが意識的に命令型と関数型を書き分けなきゃいけない言語仕様になってるだけ
他の言語でマクロなりプリプロセッサなりコーディングルール作って書き分けても実質同じことができる