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