CoeFun
CoeFun
は,関数型を持たない項を関数型に強制することができる型クラスです.
/-- 加法的な関数 -/
structure AdditiveFunction : Type where
/-- 関数部分 -/
func : Nat → Nat
/-- 加法を保つ -/
additive : ∀ x y, func (x + y) = func x + func y
/-- 恒等写像 -/
def identity : AdditiveFunction := ⟨id, by intro x y; rfl⟩
#check (identity : AdditiveFunction)
-- `identity` の型は `AdditiveFunction` であって,関数ではないのでこれはエラーになる
#check_failure (identity 1)
-- `CoeFun` を使って `AdditiveFunction` の項を関数型 `Nat → Nat` に強制する
instance : CoeFun AdditiveFunction (fun _ => Nat → Nat) where
coe f := f.func
-- まるで関数のように使えるようになる
#check (identity 1)
上記の例ではどんな t : AdditiveFunction
も同じ型 Nat → Nat
に強制していますが,実際には依存関数型に強制することができます.