Concurrent Clean : 平均

http://wirbeln.tblog.jp/?eid=72499で平均を求める関数をCleanで書いている。
こういう風に書くのはどうだろう?

mean ls = (\(x,y) = toReal x/toReal y) $ foldl (\(x,y) a = (x+a, y+1)) (0,0) ls

ただし、$は以下のように定義する。([id:lethevert:20051222:p2]では、infixlとしていたが、infixrの方が適切なようだ。http://grape.sapid.org/tutorial/haskell.html

($) infixr 0 //:: (a -> b) a -> b
($) f a :== f a

本当は、以下の方が分かりやすいが、上のほうが計算量が少ないはずだ。

mean ls = sum/len
where
    sum = toReal $ foldl (+) 0 ls
    len = toReal $ length ls

ところで、以下のようにやることもできる。toRealを呼ぶ回数が増えるが、それ以上の差はないことは、Cleanが遅延評価だからなせる技だ。

mean ls = (\(x,y) = x/y) $ foldl (\(x,y) a = (x+a, y+1.0)) (0.0,0.0) $ map toReal ls