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 インスタンス
Option
は Functor
型クラスのインスタンスであり、<$>
が使用できます。実装上は 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