blob: 1878116aa78b52deae8331dc6aab2ae144f84345 [file] [edit]
structure A :=
(a : Nat)
structure B :=
(a : Nat)
structure C :=
(a : Nat)
instance : Coe A B := ⟨fun s => ⟨s.1⟩⟩
instance : Coe A C := ⟨fun s => ⟨s.1⟩⟩
def f {α} (a b : α) := a
def forceB {α} (b : B) (a : α) := a
def forceC {α} (c : C) (a : α) := a
def forceA {α} (a : A) (o : α) := o
def f1 (x : _) (y : _) (z : _) :=
let a1 := f x y;
let a2 := f y z;
forceB x a1 -- works
def f2 (x : _) (y : _) (z : _) :=
let a1 := f x ↑y;
let a2 := f ↑y z;
forceB x (forceC z (forceA y (a1, a2))) -- works because we manually added the coercions above
#exit
def f3 (x : _) (y : _) (z : _) :=
let a1 := f x y;
let a2 := f y z;
/- Fails because we "missed" the opportunity to insert coercions around `y`.
I think we should **not** support this kind of example. -/
forceB x (forceC z (forceA y (a1, a2)))