Перегрузка - ключевая особенность logi c Изабель. Это позволяет вам объявить единственную константу с "широким" типом, который может быть определен для определенных c типов. Пользователям редко приходится делать это вручную. Это базовый механизм, используемый для реализации классов типов. Например, если вы определяете класс типа следующим образом:
class empty =
fixes empty :: 'a
assumes (* ... *)
Затем команда class
объявляет константу empty
типа 'a'
, а последующие экземпляры просто предоставляют определение из empty
для определенных типов c, например nat
или list
.
Короче говоря: перегрузка - для большинства целей - деталь реализации, которая управляется вышестоящими Команды уровня. Иногда возникает необходимость ручной настройки, например, когда вам нужно определить тип, который зависит от ограничений класса.
Ad-ho c перегрузка , на мой взгляд, вводящее в заблуждение имя. Насколько я понимаю, это происходит из Haskell (см. эту статью Wadler and Blott ). Там они используют его для точного описания механизма классов типов, который в Isabelle был бы придуман как просто «перегрузка». В Isabelle ad-ho c overloading означает нечто совершенно иное. Идея состоит в том, что вы можете использовать его для определения абстрактного синтаксиса (например, нотации до монад) , который не может быть точно уловлен системой простых типов Изабель в стиле ML . Как и в случае с перегрузкой, вы должны определить константу с «широким» типом. Но эта константа никогда не получает никаких определений! Вместо этого вы определяете новые константы с более конкретными c типами. Когда синтаксический анализатор терминов Изабель обнаруживает использование абстрактной константы, он пытается заменить конкретной константой.
Например: вы можете использовать do-notation с option
, list
и несколько других типов. Если вы напишете что-то вроде:
do { x <- foo; bar }
, Изабель увидит:
Monad_Syntax.bind foo (%x. bar)
На втором этапе, в зависимости от типа foo
, он преобразует его в один из этих возможных терминов:
Option.bind foo (%x. bar)
List.bind foo (%x. bar)
(* ... more possibilities ...*)
Опять же, пользователям, вероятно, не нужно иметь дело с этой концепцией явно. Если вы извлечете Monad_Syntax
из библиотеки, вы получите одно приложение специальной перегрузки c, которое будет легко сконфигурировано.
Короче говоря: специальная перегрузка c - это механизм для включения «модный» синтаксис в Изабель. Новичков это может смутить, потому что сообщения об ошибках, как правило, трудно понять, если что-то не так во внутреннем переводе.