Cleanでfarey数列

farey数列の記事を見かけたのでCleanで書いてみた. 流石Clean!!コードが短いぜ!

module farey

import StdEnv
import Rational
import BigInt

farey 1 = [(0/:1),(1/:1)]
farey n = foldr f [] (farey (n-1))
where
  f x []     = [x]
  f x [y:ys] = let m = (numerator(x)+numerator(y)) /: (denominator(x)+denominator(y))
               in
		 if ((toInt $ denominator m) <= n) [x,m,y:ys] [x,y:ys]

// 見づらいので自作
rtos r = "(" +++. toString (numerator(r))   +++.
         "/" +++. toString (denominator(r)) +++.
         ")"

Start = map rtos (farey 8)

foldが(俺の中で)はやりなので何も考えずにfold使ったけど,どうするのがいいのかな?
それっぽい関数は別にありそうな気もする.
あとなぜかRational型の分母と分子がBigIntなんだよなー.