Coe

Coe は,型強制(coercion)と呼ばれる仕組みをユーザが定義するための型クラスです.

ある型 T が期待される場所に別の型の項 s : S を見つけると,Lean は型エラーにする前に自動的に型変換を行うことができないか試します.ここで行われる「自動的な型変換」が型強制です.型強制を明示的に指定するには, 記号をつけて ↑x などのようにします.

具体的には Coe S T という型クラスのインスタンスが定義されているとき,型 S の項が型 T に変換されます.

例えば,正の自然数からなる型 Pos を定義したとします.包含関係から Pos → Nat という変換ができるはずです.この変換を関数として定義するだけでは,必要になるごとに毎回書かなければなりませんが,型強制を使うと自動化することができます.

inductive Pos where
  | one : Pos
  | succ : Pos → Pos

def one : Pos := Pos.one

-- `List.drop` の引数は `Nat` なのに,`Pos` を渡したのでエラーになっている
#check_failure [1, 2, 3].drop one

/-- `Pos` から `Nat` へ変換する -/
def Pos.toNat : Pos → Nat
  | one => 1
  | succ n => n.toNat + 1

instance : Coe Pos Nat where
  coe n := n.toNat

-- 自動的に `Pos` から `Nat` への変換が行われてエラーにならない
#check [1, 2, 3].drop one

-- 明示的に型強制を行った例
#check [1, 2, 3].drop (↑one)