This PR rewords the "application type mismatch" error message so that the argument and its type precede the application expression.
54 lines
1.2 KiB
Text
54 lines
1.2 KiB
Text
/-- A `Vec` is just a `List α` of statically known size -/
|
||
def Vec (α : Type _) (n : Nat) : Type _
|
||
:= Fin n → α
|
||
|
||
abbrev TypeVec : Nat → Type _
|
||
:= Vec (Type _)
|
||
|
||
/-- A dependent vector is a heterogeneous list of statically known size -/
|
||
def DVec {n : Nat} (αs : TypeVec n) : Type _
|
||
:= (i : Fin n) → (αs i)
|
||
|
||
/-- A vector that repeats a single element `a` -/
|
||
def Vec.const {α : Type _} (a : α) (n : Nat) : Vec α n
|
||
:= fun _ => a
|
||
|
||
/- `Vec` is defeq to a `DVec` with constant type -/
|
||
unif_hint (α : Type _) (n : Nat) where
|
||
|- Vec α n =?= DVec (Vec.const α n)
|
||
|
||
namespace DVec
|
||
def hd {n : Nat} {αs : TypeVec (n+1)} (v : DVec αs) : (αs 0)
|
||
:= v 0
|
||
end DVec
|
||
|
||
namespace Vec
|
||
export DVec (hd)
|
||
end Vec
|
||
|
||
def ts : TypeVec 1 := Vec.const Nat 1
|
||
|
||
-- works
|
||
example (v : DVec ts) : Nat :=
|
||
v.hd
|
||
|
||
-- works
|
||
example (v : Vec Nat 1) : Nat :=
|
||
DVec.hd v
|
||
|
||
#check @Vec.hd
|
||
|
||
-- Does not work: Aliases find that `v` could be the `TypeVec` argument since `TypeVec` is an abbrev for `Vec`.
|
||
/--
|
||
error: Application type mismatch: The argument
|
||
v
|
||
has type
|
||
Vec Nat 1
|
||
of sort `Type` but is expected to have type
|
||
TypeVec (?_ + 1)
|
||
of sort `Type (_ + 1)` in the application
|
||
@DVec.hd ?_ v
|
||
-/
|
||
#guard_msgs in set_option pp.mvars false in
|
||
example (v : Vec Nat 1) : Nat :=
|
||
v.hd
|