Add
Add
は +
という二項演算子のための型クラスです。+
記法が何を意味するかについては制約はありません。ここまで HAdd
と同じですが、HAdd
は異なるかもしれない型 α, β, γ
に対して足し算 (· + ·) : α → β → γ
を定義することができる一方で、Add
は同じ型 α
に対して足し算 (· + ·) : α → α → α
を定義することしかできません。
/-- 自前で定義した自然数 -/
inductive MyNat where
| zero
| succ (n : MyNat)
namespace MyNat
/- ## MyNat の足し算を定義する -/
def add (m n : MyNat) : MyNat :=
match n with
| zero => m
| succ n => succ (add m n)
-- 記法が定義されていないので使えない
#check_failure MyNat.zero + MyNat.zero
-- `add` 関数を `+` の実装とする
instance : Add MyNat where
add := add
-- 足し算記号が使えるようになった
#check MyNat.zero + MyNat.zero
end MyNat
舞台裏
Add
型クラスは、内部的には HAdd
に展開されています。
-- #check コマンドの出力で記法を使わないようにする
set_option pp.notation false in
/- info: HAdd.hAdd MyNat.zero MyNat.zero : MyNat -/
#check MyNat.zero + MyNat.zero