The catch is that you have to define way more types, but if the code is complex enough it's really worth it.