可选值:要么是用 some 包裹的底层类型值,要么是 none。
对 Option 的 与 两种情形,结果按所述规则确定。
构造子
Option.none.{u} {α : Type u} : Option α
没有值。
Option.some.{u} {α : Type u} (val : α) : Option α
某个类型为 α 的值。
Option α 是一种值的类型,它可以是某个 some v,其中 v:α;也可以是 none。
在函数式编程中,此类型的使用方式类似于可空类型:none 表示不存在值。
此外,从 α 到 β 的偏函数可以由类型 α → Option β 来表示,当该函数对某些输入未定义时,结果即为 none。
在计算上,这些偏函数表示失败或错误的可能性,并且它们对应于可以提前终止但不抛出包含信息之异常的程序。
Option 也可以被认为类似于最多包含一个元素的列表。
从这个角度来看,遍历 Option 包括仅在存在值时才执行操作。
Option API 经常使用这种视角。
函数 Std.HashMap.get? 接受键 a : α,并在指定的 HashMap α β 中查找它:
Std.HashMap.get?.{u, v} {α : Type u} {β : Type v}
[BEq α] [Hashable α]
(m : HashMap α β) (a : α) :
Option β
因为无法事先知道该键是否确实在映射中,所以返回类型为 Option β,其中 none 表示该键不在映射中,而 some b 表示找到了该键,并且 b 是检索到的值。
xs[i] 语法用于在有可用证明证明 i 是 xs 的有效索引时索引到集合中,它有一个变体 xs[i]?,该变体会根据给定索引是否有效来返回一个可选值。
如果 m:HashMap α β 并且 a:α,那么 m[a]? 等价于 HashMap.get? m a。
在许多编程语言中,记住检查空值非常重要。
当使用 Option 时,类型系统会在正确的地方要求进行这些检查:Option α 和 α 不是同一种类型,并且在它们之间进行转换需要处理 none 的情况。
这可以通过诸如 Option.getD 之类的辅助工具或使用模式匹配来完成。
def postalCodes : Std.HashMap Nat String :=
Std.HashMap.emptyWithCapacity 1 |>.insert 12345 "Schenectady"
#eval postalCodes[12346]?.getD "not found"
#eval
match postalCodes[12346]? with
| none => "not found"
| some city => city
#eval
if let some city := postalCodes[12345]? then
city
else
"not found"
可选值:要么是用 some 包裹的底层类型值,要么是 none。
对 Option 的 与 两种情形,结果按所述规则确定。
构造子
Option.none.{u} {α : Type u} : Option α
没有值。
Option.some.{u} {α : Type u} (val : α) : Option α
某个类型为 α 的值。
从 α 到 Option α 存在一个强制转换,它会将值包装在 some 中。
这使得可以以类似于其他语言中可空类型的风格来使用 Option,在这些语言中,缺失的值由 none 指示,而存在的值没有特殊标记。
OptionOption.getDM.{u_1, u_2} {m : Type u_1 → Type u_2} {α : Type u_1} [Pure m] (x : Option α) (y : m α) : m αOption.getDM.{u_1, u_2} {m : Type u_1 → Type u_2} {α : Type u_1} [Pure m] (x : Option α) (y : m α) : m α
取得可选值;遇到 none 时以单子方式计算默认值。
它与所列操作对应或等价。(相关项:Option.getD。)
对 Option 进行分类讨论的函数。
对 none 的 some 与 Option.elim 两种情形,结果按所述规则确定。(相关项:Option。)
对 Option.elim 的 Option 与 Option.recOn 两种情形,结果按所述规则确定。(相关项:Option.map、Option.getD、(some "hello").elim 0 String.length = 5、none.elim 0 String.length = 0。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:。)
示例见所列代码。(相关项:。)
Option.elimM.{u_1, u_2} {m : Type u_1 → Type u_2} {α β : Type u_1} [Monad m] (x : m (Option α)) (y : m β) (z : α → m β) : m βOption.elimM.{u_1, u_2} {m : Type u_1 → Type u_2} {α β : Type u_1} [Monad m] (x : m (Option α)) (y : m β) (z : α → m β) : m β
对 Option 进行单子式分类讨论的函数。
对 none 的 some 与 Option.elimM 两种情形,结果按所述规则确定。(相关项:Option。)
它与所列操作对应或等价。(相关项:Option.elimM、Option.mapM、Option.getDM、Option.elim。)
若两个可选值都存在,则对它们应用函数;否则若仅有一个值存在,就返回该值且不使用函数。
对 some (fn a b) 的 some a 与 some b 两种情形,结果按所述规则确定。(相关项:Option.orElse、some x、some x、none、none、Option.merge (· + ·) none (some 3) = some 3、Option.merge (· + ·) (some 2) (some 3) = some 5。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:Option.merge (· + ·) (some 2) none = some 2。)
示例见所列代码。(相关项:Option.merge (· + ·) none none = none。)
示例见所列代码。(相关项:。)
示例见所列代码。(相关项:。)
可选值的排序通常使用 DecidableEq (Option α)、LT (Option α)、Min (Option α) 和 Max (Option α) 实例。
两个可选值的最小值,并把 none 视为最小元素。(相关项:Min (Option α)。)
此段说明该操作的行为、边界条件及推荐用法。(相关项:nightly-2025-02-27、none、min none (some x) = min (some x) none = some x。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:Option.min (some 2) (some 5) = some 2。)
示例见所列代码。(相关项:Option.min (some 5) (some 2) = some 2。)
示例见所列代码。(相关项:Option.min (some 2) none = none。)
示例见所列代码。(相关项:Option.min none (some 5) = none。)
示例见所列代码。(相关项:Option.min none none = none。)
两个可选值的最大值。
通常通过所列实例、运算符或字段记法使用此函数。(相关项:Max (Option α)。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:Option.max (some 2) (some 5) = some 5。)
示例见所列代码。(相关项:Option.max (some 5) (some 2) = some 5。)
示例见所列代码。(相关项:Option.max (some 2) none = some 2。)
示例见所列代码。(相关项:Option.max none (some 5) = some 5。)
示例见所列代码。(相关项:Option.max none none = none。)
格式化可选值,不要求 Lean 解析器能够解析结果。
通常通过所列实例、运算符或字段记法使用此函数。(相关项:ToFormat (Option α)。)
Option 可以被认为是描述一个可能无法返回值的计算。
Monad Option 实例以及 Alternative Option 正是基于这种理解。
返回 none 也可以被认为是抛出了一个不包含任何有用信息的异常,这被体现在 MonadExcept Unit Option 实例中。
若值不满足布尔谓词则返回 none,否则返回该值本身。
把 Option 看作可能失败的计算或至多含一个元素的容器时,此操作具有所述对应含义。(相关项:Option。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:Option.guard (· > 2) 1 = none。)
示例见所列代码。(相关项:Option.guard (· > 2) 5 = some 5。)
Option.bindM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Pure m] (f : α → m (Option β)) : Option α → m (Option β)Option.bindM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Pure m] (f : α → m (Option β)) : Option α → m (Option β)
Option.sequence.{u, u_1} {m : Type u → Type u_1} [Applicative m] {α : Type u} : Option (m α) → m (Option α)Option.sequence.{u, u_1} {m : Type u → Type u_1} [Applicative m] {α : Type u} : Option (m α) → m (Option α)
把可选的单子计算转换为返回可选值的单子计算。
此段说明该操作的行为、边界条件及推荐用法。(相关项:m。)
示例:
#eval show IO (Option String) from
Option.sequence <| some do
IO.println "hello"
return "world"
hello
some "world"
用处理函数从失败的 Option 计算中恢复。
通常通过所列实例、运算符或字段记法使用此函数。(相关项:MonadExceptOf Unit Option。)
以下列出相应示例或例外情况。
示例见所列代码。(相关项:Option.tryCatch none (fun () => some "handled") = some "handled"。)
示例见所列代码。(相关项:Option.tryCatch (some "succeeded") (fun () => some "handled") = some "succeeded"。)
Option 可以被认为是一个最多包含一个值的集合。
从这个角度来看,迭代运算符可以理解为对包含的值(如果存在)执行某些操作,如果不存在则什么也不做。
仅当可选值满足布尔谓词时才保留它。
在所述条件下,函数按说明返回相应结果或后备结果。(相关项:Option、Option.filter、List.filter、Array.filter。)
以下列出相应示例或例外情况。
Option.filterM.{u_1} {m : Type → Type u_1} {α : Type} [Applicative m] (p : α → m Bool) : Option α → m (Option α)Option.filterM.{u_1} {m : Type → Type u_1} {α : Type} [Applicative m] (p : α → m Bool) : Option α → m (Option α)
仅当可选值满足单子布尔谓词时才保留它。
在所述条件下,函数按说明返回相应结果或后备结果。(相关项:Option、Option.filterM、List.filterM。)
Option.forM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} [Pure m] : Option α → (α → m PUnit) → m PUnitOption.forM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} [Pure m] : Option α → (α → m PUnit) → m PUnit
Option.mapA.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Applicative m] (f : α → m β) : Option α → m (Option β)Option.mapA.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Applicative m] (f : α → m β) : Option α → m (Option β)
把某个应用函子中的函数应用于可选值;若值缺失,则无效果地返回 none。
它与所列操作对应或等价。(相关项:Option.mapM。)
Option.mapM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Applicative m] (f : α → m β) : Option α → m (Option β)Option.mapM.{u_1, u_2, u_3} {m : Type u_1 → Type u_2} {α : Type u_3} {β : Type u_1} [Applicative m] (f : α → m β) : Option α → m (Option β)
为存在的可选值“附加”某谓词成立的证明,并返回表达这一事实的子类型。
此函数主要用于良基递归的终止性证明,使迭代操作取得的值能与原参数建立所需关系。(相关项:Option.attach、Option.map。)
移除 Option 中的值确实就是该值的附加证明。
此函数主要用于良基递归的终止性证明,使迭代操作取得的值能与原参数建立所需关系。
在所述条件下,函数按说明返回相应结果或后备结果。(相关项:simp [Option.unattach, -Option.map_subtype]。)
它与所列操作对应或等价。(相关项:Option.map Subtype.val。)
Option.pelim.{u_1, u_2} {α : Type u_1} {β : Sort u_2} (o : Option α) (b : β) (f : (a : α) → o = some a → β) : βOption.pelim.{u_1, u_2} {α : Type u_1} {β : Sort u_2} (o : Option α) (b : β) (f : (a : α) → o = some a → β) : β
Option.pmap.{u_1, u_2} {α : Type u_1} {β : Type u_2} {p : α → Prop} (f : (a : α) → p a → β) (o : Option α) : (∀ (a : α), o = some a → p a) → Option βOption.pmap.{u_1, u_2} {α : Type u_1} {β : Type u_2} {p : α → Prop} (f : (a : α) → p a → β) (o : Option α) : (∀ (a : α), o = some a → p a) → Option β