まずは中間構造を考える
必要な値をリストでもってsumをとることにする
solve :: Int
solve = sum [1000未満の3の倍数または5の倍数の整数]
-- 内包表記でうまく出来そう
solve = sum [ n | n <- [1..999], n `mod` 3 == 0 || n `mod` 5 == 0]
和を個別に計算して合計を求める
solve2 :: Int
solve2 = 3の倍数の和 + 5の倍数の和 - 15の倍数の和
sigma :: Int -> Int -> Int
sigma n k = n * k*(1 + k) / 2
-- 1000未満の場合の一般化
sigma_1000 :: Int -> Int
sigma_1000 n = sigma n (999 `div` n)
solve2 = sigma_1000 3 + sigma_1000 5 - sigma_1000 15
回答1の方が直感的に分かりやすい気がするけど、回答2の方が(完全に)優れてる?
回答1のリスト内包表記で条件部分(modらへん)でもっとおしゃれな書き方がありそう
計算量, 見やすさ, 文化的な観点から見て改善点や他回答があればぜひお願いします!
実務1年程度のへっぽこプログラマーなので暖かくも厳しく見守ってください
読んだ本
つまり構文を知った程度で、関数型言語っぽい書き方を学び中です