再帰が難しいので練習として色んな数列を作ってみた
main = do
putStrLn $ j $ take 8 $ s1 0 1
putStrLn $ j $ take 8 $ s2 1 2
putStrLn $ j $ take 8 $ s3
putStrLn $ j $ take 8 $ s4 0 (+1)
putStrLn $ j $ take 8 $ s4 1 (*2)
putStrLn $ j $ take 8 $ s4 1.01 (\x -> x * x)
putStrLn $ j $ take 8 $ s5 s3 -- 黄金比の導出
-- join
j [] = ""
j (x:xs) = show x ++ ", " ++ j xs
-- 等比数列
s1 x n = x : map (+n) (s1 x n)
-- 等倍数列
s2 x n = x : map (*n) (s2 x n)
-- フィボナッチ数列
s3 = 1 : 1 : [ a + b | (a, b) <- zip s3 (tail s3) ]
-- 式を与える数列
s4 x f = x : map f (s4 x f)
-- 数式の差を数式にする
s5 (x:xs) = (head xs / x) : s5 xs
フィボナッチ数列を理解するのがかなり苦労した
最初に書いたコード
s3 = 1 : 1 : [a + b | a <- s3, b <- tail s3 ]
これだと [] の中が s3 と tail s3 の直積を足したものになってしまうのでダメだった。
結局ウェブの例を見ながら理解した