OCaml の未使用変数の警告について

OCaml において,以下のような場合は未使用変数の警告が出ますが,

$ ocaml
        OCaml version 4.04.0

# let x = 1 in 1;;
Warning 26: unused variable x.
- : int = 1

次のような場合は未使用変数の警告が出ません.

$ ocaml
        OCaml version 4.04.0

# let f x = 1;;
val f : 'a -> int = <fun>

この違いが気になったので調べてみました.

OCaml の警告について最も詳しく書かれているのは ocamlc(1) の man page のようです.OCaml では警告の種類ごとに番号がついており, OCaml 4.04.0 には一部欠番はありますが 1 から 61 まであります.未使用変数についての警告は,以下の2種類です.

26 Suspicious unused variable: unused variable that is bound
with let or as, and doesn’t start with an underscore (_) charac-
ter.

27 Innocuous unused variable: unused variable that is not
bound with let nor as, and doesn’t start with an underscore (_)
character.

ocamlc(1)

-w オプションで有効にする警告を指定でき,デフォルトでは -w +a-4-6-7-9-27-29-32..39-41-42-44-45-48-50-60 が指定されています.+a であるすべての警告を有効化し,-num である番号の警告を無効化しています.(その他にもいろいろな指定方法がありますが,man page を参照して下さい.) 未使用変数についての警告については,26 のみが有効化されているため,27 も有効化すると冒頭のような例でも警告を出すことが出来ます.

$ ocaml
        OCaml version 4.04.0

# let f x = 1;;
Warning 27: unused variable x.
val f : 'a -> int = <fun>

上の例は人工的ですが,以下のようなもう少し気づきにくいようなものでも警告が出るようになるので,27 は基本的に有効化しておくと良い警告だと思います.

# List.fold_left (fun m -> fun n -> m + m);;
Warning 27: unused variable n.
- : int -> '_a list -> int = <fun>