既約分数クイズ

30分プログラム、その722。既約分数クイズにチャレンジしました。
今回は力技で解きましたが、クイズと言うからにはきっとクールな解法があるんでしょう。

使い方

*Main> irreducibleFracs 4
[(0,1),(1,1),(1,2),(1,3),(2,3),(1,4),(3,4)]

ソースコード

type Frac a = (a,a)
canReduce :: Integral a => Frac a -> Bool
fracs :: Integral a => a -> [Frac a]
irreducibleFracs :: Integral a => a -> [Frac a]

canReduce (a,b)= gcd a b /= 1
fracs n = [(p,q) |  q <- [1..n], p <- [0..q]]
irreducibleFracs n = [f | f <- fracs n, not $ canReduce f]