What I would really like to see is a statically typed language on top of the Erlang VM (dialyzer was not amazing last time I checked it, which was admittedly years ago).
-record(outside_error, {
reason :: term()
}).
-record(inside_error, {
reason :: binary()
}).
-spec to_inside_error(#outside_error{}) -> #inside_error{}.
to_inside_error(#outside_error{reason = Reason}) ->
#inside_error{reason = Reason}.
and it typechecks just fine. I mean, yeah, we actually always used to have binaries in #outside_error—until now. Now we've started to sometimes pass a map in it. And so, somewhere down the line calls to unicode:binary_to_characters/1 suddenly start crashing because a map is not a binary, duh, but! it all still typechecks. Amazing.