E = Box is also not a very good default in the typical case where you can simply return a proper error type directly without pushing it onto the heap. If we did that, we'd end up having to teach everyone that when they want to do "proper error handling" they have to stop using that default.
It does make sense for main() specifically to box its error type by default because that makes it straightforward for all types implementing Error to be compatible with ? in main(), and that cost will only be paid once at the end of a program. That's part of the reason I support a separate type name for what main() returns; it is different from your usual Result type, and for good reason.
What I somehow don't like about the 'Fallible' name is, that it puts the focus on the error case and reading 'Fallible' might seem like it fails with 'T'.
I agree with this regarding Fallible<T>
, and it's one of the reasons I prefer the version with just Fallible
and by default no explicit type parameters. The other reason is that T has to be () anyway, so there's not much point forcing the user to type () after it.