I don’t think you’re reading what I wrote very clearly, or else I didn’t communicate it properly. The structural similarity of Result<T, E> to Result<E, T> – that is, the binary representation of those types – is not what I’m concerned with.
I’m also not talking about the difference between Result<T, E> and Either<T, E>. I said that Ok and Err are symmetrical; that you could exchange one for the other (everywhere) and produce equivalent programs. You cannot produce equivalent programs by exhcanging Ok with Left, because Result and Either support different operations. (You could replace Left and Right, but that is not a distinguishing feature of Either.)
Meter(f32) you start to expect a lot of things from it and will write your code accordingly, even though it’s “just” f32 .
What Meter(f32) does for us is establish the validity of various operations on the type. It is not isomorphic to f32 in a logical sense, because f32 permits different operations. But this is not true of Result<T, E> and Result<E, T>: the exact same operations are permitted on either type (modulo their names and function composition). The differences between Ok and Err are only that the operations dealing with them are given different syntactical forms, à la the ? operator.
EDIT: I may be conflating some things improperly here, though. If Result defines ? to operate one way, what basis do I have to argue that this isn’t an difference in operation, the same as any other… The ground may not be sturdy here. What I’m trying to express is that an isomorphism between Result<T, E> and Result<E, T> includes transformations for any methods defined on the input, but ? isn’t defined the same way on the other side, so it shouldn’t be an isomorphism then.