It is indeed a universal, aka heterogenous associative data structure in which values can have different types, and the type of the value is denoted by the type of the key. However, the key type is fixed, and should be the 'a Type_equal.Id.t
type. It is better to think of those maps as object dictionaries in Python or as extensible records, here is a simple example in the toplevel
# #use "topfind";;
# #require "core_kernel";;
# open Core_kernel;;
# let name = Type_equal.Id.create ~name:"name" sexp_of_string;;
val name : string Type_equal.Id.t = <abstr>
# let age = Type_equal.Id.create ~name:"age" sexp_of_int;;
val age : int Type_equal.Id.t = <abstr>
# let dance = Type_equal.Id.create ~name:"dance" sexp_of_opaque;;
val dance : '_weak1 Type_equal.Id.t = <abstr>
# let student = Univ_map.empty;;
val student : Core_kernel.Univ_map.t = <abstr>
# let student = Univ_map.set student name "Joe";;
val student : Core_kernel.Univ_map.t = <abstr>
# let student = Univ_map.set student age 20;;
val student : Core_kernel.Univ_map.t = <abstr>
# let student = Univ_map.set student dance @@ fun () ->
print_endline "Dancing, like he never danced before";;
val student : Univ_map.t = <abstr>
# Univ_map.find_exn student name;;
- : string Univ_map.data = "Joe"
# Univ_map.find_exn student age;;
- :int Univ_map.data = 20
# Univ_map.find_exn student dance ();;
Dancing, like he never danced before
- : unit = ()
#
See also Daniel’s hmap library.