Carrying around Results or Options can feel odd at first, but once you understand the types it’s hard to not use them.
This is a great talk about how to use ADTs to contain data and pass it along in a program.
Railway oriented programming: Error handling in functional languages by Scott...