They're fundamentally different types. In `filter1`, `p` is existential. It says "you can give me a predicate, a vector of a length of your choice, and I'll give you a vector of some length that I choose"
The type of `filter2` says "you give me a predicate, a vector of a length of your choice, and I'll give you a vector of another length of your choice".
You might envision writing some weird behavior, for example, if `p` is smaller than `n`, you could truncate the result. If it's longer than `n`, you could repeat the last element up until `p`. The only problem with that signature is what to do if `n` is 0 and `p` is not (and the predicate doesn't reject all elements). Then you need to produce elements of type `a` from nowhere, which is impossible, so that function can't be written in a total manner. If you could, you could easily prove false by providing `const True` as your predicate, the empty type for `a`, 0 for `n`, and 1 for `p`. Then just take the head of the resulting `Vec _|_ 1` and you have your proof of false :)
Does that help at all?