2026-09-16
PowersOfTwo.hs
pows2 :: [Int]
pows2 = 1 : zipWith (*) pows2 pows2
main :: IO ()
main = print (take 5 pows2)
pows2は1から始めて前の項を2倍していき、[1,2,4,8,16]を出すつもりですが、実際には[1,1,1,1,1]になります。何が問題で、どう直せばよいでしょうか?
Answer
zipWith (*) pows2 pows2は「pows2の各項をそれ自身と掛ける」、つまり2乗する定義です。1番目の項は1*1=1、2番目も1*1=1で、以降ずっと1のままになります。「前の項を2倍する」には、もう一方の側を定数の列にする必要があります:
pows2 :: [Int]
pows2 = 1 : map (* 2) pows2