練習問題 8.8

関数 array_iter を改造して、関数 array_iteri を定義しなさい。この関数は、各要素に関する動作として、要素そのものだけでなく、その要素が何番目の要素なのかを表す整数も引数とします。つまり、

array_iteri f [a1; a2; …; an]

begin f 1 a1; f 2 a2; … ; f n an end

となります。型と実行例は以下の通りです。

   # array_iteri;;
   -: (int -> 'a -> 'b) -> 'a array -> unit = <fun>

   # array_iteri (fun i s -> print_string "Stasion #"; print_int i;
                            print_string ": "; print_endline s)
       [| "Tokyo"; "Shinagawa"; "Shin-Yokohama"; "Nagoya"; "Kyoto"; "Shin-Osaka" |];;

   Station #1: Tokyo
   Station #2: Shinagawa
   Station #3: Shin-Yokohama
   Station #4: Nagoya
   Station #5: Kyoto
   Station #6: Shin-Osaka
   - : unit = ()

解答

let array_iteri f arr =
  let i = ref 0 and j = Array.length arr in
  while (!i < j) do
      f (!i+ 1)  arr.(!i);
      i := !i + 1
  done
;;

array_iteri (fun i s -> print_string "Stasion #"; print_int i;
              print_string ": "; print_endline s)
  [| "Tokyo"; "Shinagawa"; "Shin-Yokohama"; "Nagoya"; "Kyoto"; "Shin-Osaka" |];;

実行例

Stasion #1: Tokyo
Stasion #2: Shinagawa
Stasion #3: Shin-Yokohama
Stasion #4: Nagoya
Stasion #5: Kyoto
Stasion #6: Shin-Osaka
- : unit = ()