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>"
なぜだろう?