I suspect there's no real benefit unless you can parametrize by the concrete type of the inverse at construction time, which I agree is annoying. You can (ab)use comprehensions to get access to the inferred return type of `pinv` for a given input type in a way that type inference can use later, but that's ugly enough that I'm not really comfortable endorsing it.

Since `Plan` is abstract, I'm not sure that typeassert in `pinv` does much, although I admit I haven't tested this code. Without type inference, the return type of `\` will not be known, so looping over the output in the same function that makes the call would be slow.