| 1 | datatype t = |
| 2 | A of int ref * int |
| 3 | | B |
| 4 | |
| 5 | val n = 100 |
| 6 | |
| 7 | val a = Array.tabulate (n, fn i => |
| 8 | case i mod 3 of |
| 9 | 0 => B |
| 10 | | 1 => A (ref 13, 14) |
| 11 | | 2 => A (ref 15, 16)) |
| 12 | |
| 13 | datatype t = |
| 14 | A' of int ref * int |
| 15 | | B' |
| 16 | |
| 17 | val a' = |
| 18 | Array.tabulate (n, fn i => |
| 19 | case Array.sub (a, i) of |
| 20 | B => B' |
| 21 | | A (r, n) => A' (r, n + 1)) |
| 22 | |
| 23 | val _ = Array.app (fn A (r, n) => r := 17 + n + !r | B => ()) a |
| 24 | |
| 25 | val _ = |
| 26 | case Array.sub (a', 1) of |
| 27 | A' (r, n) => print (concat [Int.toString (!r + n), "\n"]) |
| 28 | | B' => () |