This was an "obvious" bug (a missing pattern) being masked by me doing a pattern match inside an array constructor -- if the pattern doesn't match then it'll skip that value, rather than causing an error like it does in a case.