@type representation for string maps

You noticed correctly that while there’s a :atom literal type, there’s no counterpart for strings. binary() is the most concrete type supported. While I agree that supporting that would be a real boon to documentation using types the syntax for manual type definition is just the smallest part to your ask. The larger part is extending the typesystem and users of the typesystem (dialyzer) to handle that new more granular type.

I can’t say for sure, but I can imagine that this might even be quite a lot of effort. :atom on the beam become a lookup on the atom table, so they turn essentially to an integer. Whole binaries might be a lot harder for the typesystem to keep track of, especially larger ones.

However given dialyzer already “drops granularity” eventually when it starts to track complex data I’d be curious if that couldn’t be used as an argument for allowing the definition of individual binaries. Dialyzer could maybe treat too complex binaries as binary(). The latest otp release actually included changes to dialyzer for nominal types: Eep 0069 - Erlang/OTP

1 Like