The need for this happens so often at my team that we actually defined a `take!/2` function for maps in our codebase. We use it mostly for creating a map of a subset of the keys in a struct (e.g. in order to render JSON or send it to Elasticsearch). In these cases, we want the runtime to yell at us if there's a typo in one of the key names, instead of silently passing a map without that key around. It is a very simple function to add to any codebase, so I don't think the mere fact that this function is absent is enough to justify bringing in a new dependency to my project, let alone adding it to the standard library.
However, our community always preferred (
and was encouraged to) write assertive code, as it leads to errors that happen in the right place. Under this light, I can see how a strict version of `take` could be beneficial to the community, as we could encourage developers to use it unless some of the keys they are trying to take may not exist. I did a quick search in our app's codebase and found a lot of usages of `Map.take/2` that doesn't benefit from this non-strict behavior. Quite the opposite, a typo could lead to strange errors down the line that would be potentially hard to trace back.
I'm not so sure about `drop!/2`, though. The Map module doesn't contain a `delete!/2` function and I never really missed the strictness when deleting a key from a map (I guess that having some extra data is less problematic than having some missing data). Also, the current implementation of `delete/2`, used by `drop/2`, is based on a NIF, so there may be performance impacts when using the new function. But, by following the same argument of assertive code that I presented previously, if a `drop!/2` function were to be introduced in the standard library, maybe it should be worth adding a `delete!/2` function too.