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