Namaran

Code daily. Without assist.

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