Elm enforces this since 2014 at the package manager level. They are able to do this because since the language is pure, the compiler knows if a function's signature has changed. If you are changing implementation details that don't affect data transformation, then that would just be a dot release. I haven't actually published an Elm package, but from what I've read this seems like a great setup.