三角数のリスト
正の整数 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 さんに感謝 !