Почему и класс типов, и механизм неявных аргументов?
Таким образом, мы можем иметь явные аргументы, обозначенные ()
,
Мы также можем иметь неявные аргументы, обозначаемые как {}
,
Все идет нормально.
Однако зачем нам также []
обозначения для классов типов конкретно?
В чем разница между следующими двумя:
theorem foo {x : Type} : ∀s : inhabited x, x := sorry
theorem foo' {x : Type} [s : inhabited x] : x := sorry
1 ответ
Неявные аргументы вставляются автоматически разработчиком Lean. {x : Type}
который появляется в обоих ваших определениях, является одним из примеров неявного аргумента: если у вас есть s : inhabited nat
тогда можешь написать foo s
, который будет разрабатывать с точки зрения типа nat
, поскольку x
аргумент может быть выведен из s
,
Аргументы класса type - это еще один вид неявного аргумента. Вместо того, чтобы выводиться из более поздних аргументов, разработчик запускает процедуру, называемую разрешением класса типов, которая попытается сгенерировать термин указанного типа. (См. Главу 10 в https://leanprover.github.io/theorem_proving_in_lean/theorem_proving_in_lean.pdf.) Итак, ваш foo'
на самом деле не будет принимать никаких аргументов вообще. Если ожидаемый тип x
может быть выведен из контекста, Лин будет искать экземпляр 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
,