13.2 About patterns of parametric types
When matching objects of a parametric type, constructors in patterns
do not expect the parameter arguments. Their value is deduced
during expansion.
Consider for example the polymorphic lists:
Coq < Inductive List [A:Set] :Set :=
Coq < nil:(List A)
Coq < | cons:A->(List A)->(List A).
List_ind is defined
List_rec is defined
List_rect is defined
List is defined
We can check the function tail:
Coq < Check [l:(List nat)]Cases l of
Coq < nil => (nil nat)
Coq < | (cons _ l') => l'
Coq < end.
[l:(List nat)]Cases l of
nil => (nil nat)
| (cons _ l') => l'
end
: (List nat)->(List nat)
When we use parameters in patterns there is an error message:
Coq < Check [l:(List nat)]Cases l of
Coq < (nil nat) => (nil nat)
Coq < | (cons nat _ l') => l'
Coq < end.
Toplevel input, characters 6-169
> ..... [l:(List nat)]Cases l of
> (nil nat) => (nil nat)
> | (cons nat _ l') => l'
> end
Error: In pattern (nil nat) the constructor nil expects 0 arguments.