import Lean structure WrappedNat where val : Nat structure WrappedFun (α) where fn : Nat → α structure WrappedType where typ : Type attribute [coe] WrappedNat.val instance : Coe WrappedNat Nat where coe := WrappedNat.val #eval Lean.Meta.registerCoercion ``WrappedFun.fn (some ⟨2, 1, .coeFun⟩) instance : CoeFun (WrappedFun α) (fun _ => Nat → α) where coe := WrappedFun.fn #eval Lean.Meta.registerCoercion ``WrappedType.typ (some ⟨1, 0, .coeSort⟩) instance : CoeSort WrappedType Type where coe := WrappedType.typ section coe variable (n : WrappedNat) #check (↑n : Nat) #check n.val end coe section coeFun variable (f : WrappedFun Nat) (g : Nat → WrappedFun Nat) (h : WrappedFun (WrappedFun Nat)) #check f.fn #check ⇑f #check ⇑f 1 #check ⇑(g 1) #check g 1 2 #check ⇑h end coeFun section coeSort variable (t : WrappedType) #check t.typ #check ↥t end coeSort