三角数のリスト

正の整数 n と (n - 1) 番目の三角数の tuple の無限リスト

[(1,0),(2,1),(3,3),(4,6),...]

を生成する関数をなるべく短く書きたいんだけどどうしたものか。

[ (n, sum [0..(n - 1)]) | n <- [1..] ]

とか

[ (n, n * (n - 1) `div` 2) | n <- [1..] ]

とか書けばできるんだろうけど…。

発端は

0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
15+6=21
21+7=28
28+8=36
36+9=45
45+10=55

と出力するプログラムを Haskellなるべく短く書きたいというお話です。

追記 : 同じ無限リストを作るなら

zip [1..] $ scanl (+) 0 [1..]

がわずかに短い。あと、出力のための文字列を生成する方法として

foo m n = (show m ++ "+" ++ show n ++ "=" ++ show (m + n)) : foo (m + n) (n + 1)

というやり方も教えてもらいました。id:fumiexcel さんに感謝 !