import Lean open Lean def f (xs : List Nat) (delta : Nat) : List Nat := runST (fun ω => visit xs |>.run) where visit {ω} : List Nat → MonadCacheT Nat Nat (ST ω) (List Nat) | [] => return [] | a::as => do let b ← checkCache a fun _ => return a + delta return b :: (← visit as) def tst (xs : List Nat) : IO Unit := do IO.println (f xs 10) IO.println (f xs 20) IO.println (f xs 30) #eval tst [1, 2, 3, 1, 2]