2026-09-12
RunningMax.hs
runningMax :: [Int] -> [Int]
-- write this: return, for each position, the largest value seen
-- up to and including it
[3, 1, 4, 1, 5]から[3, 3, 4, 4, 5]を作るように、各位置までの最大値を並べた新しいリストを返すrunningMaxを実装してください。ミュータブルな変数を1つも使わずに書けます。
Reference
runningMax :: [Int] -> [Int]
runningMax [] = []
runningMax (x : xs) = go x xs
where
go current [] = [current]
go current (y : ys) = current : go (max current y) ys
命令型の発想なら「これまでの最大値」を持つ変数を1つ用意して更新していくところですが、Haskellではgoの引数currentそのものが「これまでの最大値」であり、次に進むたびにmax current yという新しい値を次の呼び出しへ渡すだけです。同じ名前の入れ物を書き換えるのではなく、そのつど新しい不変な値を作って引き継いでいく——それが可変変数のいらない書き方です。これは参考実装であり、唯一の正解ではありません。