In the following code
Set Implicit Arguments.
Unset Strict Implicit.
Record graph := {
obj :> Type;
arrows : Type;
s : arrows -> obj;
t : arrows -> obj;
}.
the first argument of s
(of type graph
) is implicit but if I remove Unset Strict Implicit.
(and I add, just for clarity, Set Strongly Strict Implicit.
) the first argument of s
is not implicit anymore, which shows that this argument is considered as implicit but not as strict implicit. For which reason isn't it strict implicit? Indeed, from the type of the second argument of s
(which is arrows g
, where g
is the first argument of s
), we can deduce the first argument of s
. It seems to me that the situation is similar to the one described here:
For instance, the first argument of
cons: forall A:Set, A -> list A -> list A
in module List.v is strict because list is an inductive type and A will always be inferable from the type list A of the third argument of cons.
What is the fundamental difference between the two situations that makes the first argument of s
non-strict implicit?