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なんだよなー.