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