Namaran

Code daily. Without assist.

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という新しい値を次の呼び出しへ渡すだけです。同じ名前の入れ物を書き換えるのではなく、そのつど新しい不変な値を作って引き継いでいく——それが可変変数のいらない書き方です。これは参考実装であり、唯一の正解ではありません。