haskellでバブルソート

こ、こんなに辛いとは思いもよらなかった。
しかし、内部で利用している関数bを2回呼び出しているあたりが今の限界。しかも関数bはちょっと変則的に作ってるしな。リスト構造は後ろからたどるのが辛い。foldrかなぁ。
この点で変数って素晴らしいとおもってしまうのだが変数を使わなければならないときにはアルゴリズム自身を変えるべきなのだろうか。

なんか参照渡しでなくて値渡しでやっている時点で負けな気がしないでもないな。
配列とリストはデータ形式が違うということでちょっと考え直そう

Prelude> let bsort [] = [] ;bsort x = [head $ b x]++(bsort $ tail $ b x)  where b (x:[])=[x];b (x1:x2:xs)=if x1>x2 then f x1 (b (x2:xs)) else f x2 (b (x1:xs)) where  f x (y:ys) = y:x:ys
Prelude> bsort [2,1,2,3]
[1,2,2,3] 
Prelude> bsort [2,1,2,3,5]
[1,2,2,3,5]
Prelude> bsort [2,1,5,2,3,5]
[1,2,2,3,5,5]

その後 bはfoldrで以下のように書き直せるがbを二回呼ぶところはそのまま

Prelude> let b = foldr (\x y->if y==[] then [x] else if x > (head y) then ((head y):x:(tail y)) else (x:y)) []
Prelude> b [4,3,2,1]
[1,4,3,2]

もしかして、関数型言語では変数をつかえないところは複数回呼ぶのは普通なんだろうか環境が計算してくれたりする特典あったりするんだろうか。
まあ、わからんな。