所以我们可以有明确的参数,用()表示。我们也可以有隐式参数,用{}表示。
到现在为止还挺好。
但是,为什么我们还需要特定的类型类的[]表示法?
…
Lean的elaborator会自动插入隐式参数。该 {x : Type} 出现在两个定义中的是一个隐含参数的例子:如果有的话 s : inhabited nat ,那你就可以写了 foo s ,这将详细说明一个类型的术语 nat ,因为 x 参数可以从中推断出来 s 。
{x : Type}
s : inhabited nat
foo s
nat
x
s
类型参数是另一种隐式参数。 elaborator运行一个名为的过程,而不是从后面的参数中推断出来 类型分辨率 将尝试生成指定类型的术语。 (见第10章) https://leanprover.github.io/theorem_proving_in_lean/theorem_proving_in_lean.pdf 那么,你的 foo' 实际上根本不会参与任何争论。如果是预期的类型 x 可以从上下文推断,精益会寻找一个实例 inhabited x 并插入它:
foo'
inhabited x
def foo' {x : Type} [s : inhabited x] : x := default x instance inh_nat : inhabited nat := ?3? #eval (2 : ?) + foo' -- 5
在这里,精益推断 x 一定是 nat ,并查找并插入实例 inhabited nat , 以便 foo' 单独阐述一个类型的术语 nat 。
inhabited nat