関数型言語初心者です。

Haskellでクイックソートのコードを以前見かけて、こんなにシンプルになるのかと感動しました。

では、バブルソート(二重for文で大小比較の単純なやつ)はどうなるのでしょうか。
iとjを引数にして二重に再帰を繰り返し、takeやdropで切り貼りするしか無いのでしょうか?
もっと効率のいいやり方があるのでは、と思うのですが…