Namaran

Code daily. Without assist.

2026-09-16

Triangulars.hs

triangulars :: [Int]
triangulars = 0 : zipWith (+) triangulars [1 ..]

main :: IO ()
main = print (take 6 triangulars)

これは何を出力するでしょうか?

Answer

[0,1,3,6,10,15](その後に改行)。triangularsは自分自身を参照する無限リストで、n番目の要素は「triangularsn番目」と「[1..]n番目」をzipWith (+)で足したものです。遅延評価のおかげで、各要素は必要になった時点で1つ前の要素から計算されます: 0, 0+1=1, 1+2=3, 3+3=6, 6+4=10, 10+5=15。正格評価の言語では、こう書くと自分自身の値を要求して止まらないため、同じ定義はそのままでは書けません。