match withとObj.tag

open Obj

let f x = 
  match tag (repr x) with
   | int_tag -> "<int>"
   | string_of_int -> "<string>"

とやると、

let f x = 
  match tag @@ repr x with
    | int_tag -> "<int>"
    | string_of_int -> "<string>";;
                                          Characters 468-481:
Warning U: this match case is unused.
      | string_of_int -> "<string>";;
        ^^^^^^^^^^^^^

という警告がでる。実際にどんな型のxを入れても、int_tagのほうに行く。

でも、if式で書くとちゃんと分岐できる。

let f x = 
  if Obj.tag (Obj.repr x) = int_tag then
    "<int>"
  else if Obj.tag (Obj.repr x) = string_tag then
    "<string>"
  else
    "<other>"

なぜだろう?