Juste pour dire que vous délirez avec les () qui n'existent pas, ou sont "optimisés"...
Ça n'est pas possible "à cause" du polymorphisme.
exemples:
# let toto (e : unit) = e ;;
val toto : unit -> unit = <fun>
# ((Obj.magic toto) : string -> string) "PLOP" ;;
- : string = "PLOP"
# [()] ;;
- : unit list = [()]
Cependant, ça doit être possible sur une VM typée...