Option

Option は、失敗するかもしれない計算を表す型です。

Option は帰納型として定義されています。α : Type u に対して、Option αsome a または none のいずれかの形をした項になっています。none は計算が失敗し、値を返せなかったことを表します。

inductive Option.{u} (α : Type u) where
  /-- 値が返せないことを意味する。 -/
  | none : Option α
  /-- `α` 型の値を単に包んだもの。 -/
  | some (val : α) : Option α

典型的な使用例

たとえば、配列 xs : Array α に対して、インデックス i の要素は存在するとは限りません。xs の長さよりも i が大きければ、返すべき値がないからです。このため、Lean の標準ライブラリには返り値を Option に包んだ関数が用意されています。

-- インデックス 0 の要素は存在するので取得できる
#guard Array.get? #[1, 2, 3] 0 = some 1

-- インデックス 3 の要素は存在しないので取得できず、none が返ってくる
#guard Array.get? #[1, 2, 3] 3 = none

配列やリストなどのコレクション型から要素を取り出す類の操作には、多くの場合返り値が Option に包まれた関数が用意されます。より詳しくは GetElem のページを参照してください。

Functor インスタンス

OptionFunctor 型クラスのインスタンスであり、<$> が使用できます。実装上は Option.map が使用されます。

section

  variable {α β : Type}

  -- `<$>` は `Option.map` で実装されている
  example (x? : Option α) (f : α → β) : f <$> x? = Option.map f x? := by
    rfl

end

Option.map f x? は、x?some x ならば some (f x) を返し、x?none ならば none を返します。

section
  variable {α β : Type}

  -- `Option.map f` は some x を some (f x) に写す
  example (x : α) (f : α → β) : Option.map f (some x) = some (f x) := by
    rfl

  -- `Option.map f` は none を none に写す
  example (f : α → β) : Option.map f none = none := by
    rfl

end