What happens when you need an "else" branch?
Is not having a person for the given ID an error, is it a "do nothing", or does it mean to create a new person?
What does the callback version do if you forget to make your index unique, and end up with multiple people with the same ID; does it get run multiple times? The version that returns a Maybe<Person> at least has an obvious proper response (throw an error).