каррирование
В математике и информатике , каррирование — это метод перевода функции , принимающей несколько аргументов в последовательность семейств функций, каждое из которых принимает один аргумент.
В прототипном примере все начинается с функции это принимает два аргумента, один из и один из и производит объекты в Каррированная форма этой функции рассматривает первый аргумент как параметр, чтобы создать семейство функций. Семейство устроено так, что для каждого объекта в есть ровно одна функция
В этом примере сама становится функцией, которая принимает в качестве аргумента и возвращает функцию, которая отображает каждый к Правильная нотация для выражения этого — многословная. Функция принадлежит набору функций Тем временем, принадлежит набору функций Таким образом, что-то, что отображает к будет типа С помощью этого обозначения — это функция, которая принимает объекты из первого набора и возвращает объекты из второго набора, поэтому пишут Это несколько неформальный пример; более точные определения того, что подразумевается под «объектом» и «функцией», приведены ниже. Эти определения варьируются от контекста к контексту и принимают разные формы в зависимости от теории, над которой работает человек.
Каррирование связано с частичным применением , но не совпадает с ним . [1] [2] Приведенный выше пример можно использовать для иллюстрации частичного применения; это очень похоже. Частичное применение — это функция для этого нужна пара и вместе в качестве аргументов и возвращает Используя те же обозначения, что и выше, частичное применение имеет подпись Написанное таким образом приложение можно считать сопряженным с каррированием.
Каррирование функции с более чем двумя аргументами можно определить методом индукции.
Каррирование полезно как в практическом, так и в теоретическом плане. В языках функционального программирования и многих других он обеспечивает способ автоматического управления передачей аргументов функциям и исключениям. В теоретической информатике это дает возможность изучать функции с несколькими аргументами в более простых теоретических моделях, которые предоставляют только один аргумент. Наиболее общая основа для строгого понятия каррирования и некарингирования находится в закрытых моноидальных категориях , которые лежат в основе обширного обобщения соответствия доказательств и программ Карри-Ховарда на соответствие со многими другими структурами, включая квантовую механику, кобордизмы и теорию струн. . [3]
Понятие каррирования было введено Готтлобом Фреге , [4] [5] разработанный Моисеем Шёнфинкелем , [6] [5] [7] [8] [9] [10] [11] и далее развит Haskell Curry . [8] [10] [12] [13]
Uncarrying — это двойная трансформация каррирования, которую можно рассматривать как форму дефункционализации . Требуется функция возвращаемое значение которого является другой функцией и дает новую функцию который принимает в качестве параметров аргументы для обоих и , и возвращает в результате применение и впоследствии, , к этим аргументам. Процесс можно повторять.
Мотивация
[ редактировать ]Каррирование предоставляет возможность работать с функциями, принимающими несколько аргументов, и использовать их в средах, где функции могут принимать только один аргумент. Например, некоторые аналитические методы можно применять только к функциям с одним аргументом. Практические функции часто принимают больше аргументов, чем это. Фреге показал, что достаточно предоставить решения для случая с одним аргументом, поскольку вместо этого можно преобразовать функцию с несколькими аргументами в цепочку функций с одним аргументом. Это преобразование представляет собой процесс, известный теперь как каррирование. [14] Все «обычные» функции, которые обычно встречаются в математическом анализе или компьютерном программировании, можно каррировать. Однако есть категории, в которых каррирование невозможно; наиболее общими категориями, допускающими каррирование, являются закрытые моноидальные категории .
Некоторые языки программирования почти всегда используют каррированные функции для получения нескольких аргументов; яркими примерами являются ML и Haskell , где в обоих случаях все функции имеют ровно один аргумент. Это свойство унаследовано от лямбда-исчисления , где функции с несколькими аргументами обычно представляются в каррированной форме.
Каррирование связано с частичным применением , но не совпадает с ним . [1] [2] На практике техника программирования замыканий может использоваться для выполнения частичного применения и своего рода каррирования путем сокрытия аргументов в среде, которая перемещается вместе с каррированной функцией.
История
[ редактировать ]Слово «Карри» в слове «Карри» является отсылкой к логику Хаскеллу Карри , который широко использовал эту концепцию, но Моисею Шенфинкелю за шесть лет до Карри. идея пришла в голову [10] Было предложено альтернативное название «Шенфинкелизация». [15] В математическом контексте этот принцип можно проследить до работы Фреге в 1893 году . [4] [5]
Происхождение слова «карри» неясно. Дэвид Тернер говорит, что это слово было придумано Кристофером Стрейчи в его конспектах лекций 1967 года « Фундаментальные концепции языков программирования» . [16] но этот источник представляет концепцию как «устройство, созданное Шёнфинкелем», и термин «каррирование» не используется, тогда как Карри упоминается позже в контексте функций высшего порядка. [7] Джон К. Рейнольдс дал определение «карри» в статье 1972 года, но не утверждал, что придумал этот термин. [8]
Определение
[ редактировать ]Каррирование легче всего понять, начав с неформального определения, которое затем можно адаптировать для множества различных областей. Прежде всего, необходимо установить некоторые обозначения. Обозначения обозначает все функции из к . Если есть такая функция, пишем . Позволять обозначим упорядоченные пары элементов и соответственно, то есть произведение декартово и . Здесь, и могут быть множествами, типами или объектами других типов, как описано ниже.
Дана функция
- ,
каррирование создает новую функцию
- .
То есть, принимает аргумент типа и возвращает функцию типа . Это определяется
для типа и типа . Затем мы также пишем
Uncurrying — это обратное преобразование, и его легче всего понять с точки зрения его правого сопряженного — функции
Теория множеств
[ редактировать ]В теории множеств обозначение используется для обозначения множества функций из множества на съемочную площадку . Каррирование — это естественная биекция между множеством функций из к , и набор функций из к набору функций из к . В символах:
Действительно, именно эта естественная биекция оправдывает экспоненциальное обозначение множества функций. Как и во всех случаях каррирования, приведенная выше формула описывает присоединенную пару функторов : для каждого фиксированного набора , функтор остается сопряженным с функтором .
В множеств объект категории называется экспоненциальным объектом .
Функциональные пространства
[ редактировать ]В теории функциональных пространств , например, в функциональном анализе или теории гомотопий , обычно интересуются непрерывными функциями между топологическими пространствами . Один пишет ( функтор Hom ) для множества всех функций из к и использует обозначение для обозначения подмножества непрерывных функций. Здесь, это биекция
в то время как uncurrying - это обратная карта. Если набор непрерывных функций из к задана компактно-открытая топология и если пространство локально компактен по Хаусдорфу , то
является гомеоморфизмом . Это также тот случай, когда , и генерируются компактно , [17] : глава 5 [18] хотя случаев больше. [19] [20]
Одним из полезных следствий является то, что функция непрерывна тогда и только тогда, когда ее каррированная форма непрерывна. Еще одним важным результатом является то, что карта приложения , обычно называемая в этом контексте «оценкой», является непрерывной (обратите внимание, что eval — это совершенно другое понятие в информатике).
является непрерывным, когда компактно-открыт и локально компактный Хаусдорф. [21] Эти два результата являются центральными для установления непрерывности гомотопии , т. е. когда это единичный интервал , так что можно рассматривать либо как гомотопию двух функций из к или, что то же самое, один (непрерывный) путь в .
Алгебраическая топология
[ редактировать ]В алгебраической топологии каррирование служит примером двойственности Экмана-Хилтона и, как таковое, играет важную роль во множестве различных ситуаций. Например, пространство петель сопряжено с приведенными подвесками ; обычно это пишут как
где — множество гомотопических классов отображений , и является подвеской A , и является петель A . пространством По сути, подвеска можно рассматривать как декартово произведение с единичным интервалом по модулю отношения эквивалентности, чтобы превратить интервал в цикл. Каррированная форма затем отображает пространство в пространство функций из циклов в , то есть из в . [21] Затем — это присоединенный функтор , который отображает подвески в пространства петель, а uncurrying — двойственный функтор. [21]
Двойственность между конусом отображения и слоем отображения ( корасслоение и расслоение ) [17] : главы 6,7 можно понимать как форму каррирования, что, в свою очередь, приводит к двойственности длинных точных и соточных последовательностей Пуппе .
В гомологической алгебре связь между каррированием и некарингированием известна как присоединение тензорного хома . Здесь возникает интересный поворот: функтор Hom и функтор тензорного произведения могут не подняться до точной последовательности ; это приводит к определению функтора Ext и функтора Tor .
Теория предметной области
[ редактировать ]В теории порядка , то есть теории решеток множеств частично упорядоченных , является непрерывной функцией , если решетке задана топология Скотта . [22] Непрерывные по Скотту функции были впервые исследованы в попытке обеспечить семантику лямбда-исчисления (поскольку обычная теория множеств для этого не подходит). В более общем смысле, непрерывные по Скотту функции теперь изучаются в теории предметной области , которая включает изучение денотационной семантики компьютерных алгоритмов. Обратите внимание, что топология Скотта сильно отличается от многих распространенных топологий, которые можно встретить в категории топологических пространств ; Топология Скотта обычно тоньше и не является трезвой .
Понятие непрерывности появляется в теории гомотопических типов , где, грубо говоря, две компьютерные программы можно считать гомотопными, т.е. вычислять одни и те же результаты, если их можно «непрерывно» реорганизовать из одной в другую.
Лямбда-исчисления
[ редактировать ]В теоретической информатике каррирование дает возможность изучать функции с несколькими аргументами в очень простых теоретических моделях, таких как лямбда-исчисление , в которых функции принимают только один аргумент. Рассмотрим функцию принимая два аргумента и имея тип , что следует понимать так, что x должен иметь тип , y должен иметь тип , а сама функция возвращает тип . Каррированная форма f определяется как
где является абстрактором лямбда-исчисления. Поскольку карри принимает на вход функции типа , можно сделать вывод, что сам тип карри
Оператор → часто считается правоассоциативным , поэтому тип каррированной функции часто пишется как . И наоборот, применение функции считается левоассоциативным , так что эквивалентно
- .
То есть круглые скобки не требуются для устранения неоднозначности порядка приложения.
Каррированные функции могут использоваться в любом языке программирования , поддерживающем замыкания ; однако функции без каррирования обычно предпочтительнее из соображений эффективности, поскольку тогда для большинства вызовов функций можно избежать накладных расходов на создание частичного приложения и замыкания.
Теория типов
[ редактировать ]В теории типов общая идея системы типов в информатике формализуется в конкретную алгебру типов. Например, при написании , намерение состоит в том, что и являются типами , а стрелка — это конструктор типа , в частности, тип функции или тип стрелки. Аналогично, декартово произведение типов создается конструктором продукта типа .
Теоретико-типовый подход выражен в таких языках программирования, как ML , а также в языках, производных от него и вдохновленных им: CaML , Haskell и F# .
Теоретико-типический подход обеспечивает естественное дополнение к языку теории категорий , как обсуждается ниже. Это связано с тем, что категории, и в частности, моноидальные категории , имеют внутренний язык , причем просто типизированное лямбда-исчисление наиболее ярким примером такого языка является . Это важно в этом контексте, поскольку его можно построить на основе конструктора одного типа — типа стрелки. Затем каррирование наделяет язык естественным типом продукта. Соответствие между объектами в категориях и типах затем позволяет переинтерпретировать языки программирования как логику (через соответствие Карри-Ховарда ) и как другие типы математических систем, как описано ниже.
Логика
[ редактировать ]В соответствии с соответствием Карри-Ховарда существование каррирования и некарингирования эквивалентно логической теореме. (также известный как экспорт ), поскольку кортежи ( тип продукта ) соответствуют конъюнкции в логике, а тип функции соответствует импликации.
Экспоненциальный объект в категории алгебр Гейтинга обычно записывается как материальная импликация . Дистрибутивные алгебры Гейтинга являются булевыми алгебрами , а экспоненциальный объект имеет явный вид , тем самым давая понять, что экспоненциальный объект на самом деле является материальной импликацией . [23]
Теория категорий
[ редактировать ]Вышеупомянутые понятия каррирования и некаррирования находят свое наиболее общее и абстрактное утверждение в теории категорий . Каррирование является универсальным свойством экспоненциального объекта и приводит к присоединению в декартовых замкнутых категориях . То есть существует естественный изоморфизм между морфизмами бинарного произведения и морфизмы экспоненциального объекта .
Это обобщается до более широкого результата в закрытых моноидальных категориях : Каррирование — это утверждение, что тензорное произведение и внутренний Hom являются сопряженными функторами ; то есть для каждого объекта существует естественный изоморфизм :
Здесь Hom обозначает (внешний) Hom-функтор всех морфизмов категории, а обозначает внутренний функтор hom в замкнутой моноидальной категории. Для категории множеств это одно и то же. Когда произведение является декартовым произведением, тогда внутреннее hom становится экспоненциальным объектом .
Каррирование может сломаться одним из двух способов. Один из них — если категория не является замкнутой и, следовательно, не имеет внутреннего функтора hom (возможно, потому, что для такого функтора существует более одного выбора). Другой способ — если он не является моноидальным и, следовательно, не имеет произведения (то есть не имеет способа записи пар объектов). Категории, которые имеют как продукты, так и внутренние homs, являются в точности закрытыми моноидальными категориями.
Установления декартовых замкнутых категорий достаточно для обсуждения классической логики ; более общая установка замкнутых моноидальных категорий подходит для квантовых вычислений . [24]
Разница между этими двумя заключается в том, что произведение для декартовых категорий (таких как категории множеств , полные частичные порядки или алгебры Гейтинга ) является просто декартовым произведением ; он интерпретируется как упорядоченная пара элементов (или список). Просто типизированное лямбда-исчисление является внутренним языком декартовых замкнутых категорий; и именно по этой причине пары и списки являются основными в теории типов LISP типами , Scheme и многих функциональных языков программирования .
Напротив, произведение для моноидальных категорий (таких как гильбертово пространство и векторные пространства функционального анализа ) является тензорным произведением . Внутренним языком таких категорий является линейная логика , форма квантовой логики ; соответствующая система типов — это система линейных типов . Такие категории подходят для описания запутанных квантовых состояний и, в более общем плане, позволяют широко обобщить соответствие Карри-Ховарда на квантовую механику , кобордизмы в алгебраической топологии и теорию струн . [3] Система линейного типа и линейная логика полезны для описания примитивов синхронизации , таких как блокировки взаимного исключения, и работы торговых автоматов.
Контраст с применением частичной функции
[ редактировать ]Каррирование и частичное применение функций часто путают. [1] [2] Одно из существенных различий между ними заключается в том, что вызов частично примененной функции возвращает результат сразу, а не другой функции в цепочке каррирования; это различие можно наглядно проиллюстрировать для функций, арность которых больше двух. [25]
Дана функция типа , карри производит . То есть, хотя оценку первой функции можно представить как , оценка каррированной функции будет представлена как , применяя каждый аргумент по очереди к функции с одним аргументом, возвращенной предыдущим вызовом. Обратите внимание, что после вызова , у нас остается функция, которая принимает один аргумент и возвращает другую функцию, а не функция, которая принимает два аргумента.
Напротив, применение частичной функции относится к процессу фиксации ряда аргументов функции, в результате чего создается другая функция меньшей арности. Учитывая определение выше, мы могли бы исправить (или «привязать») первый аргумент, создав функцию типа . Вычисление этой функции можно представить как . Обратите внимание, что результатом применения частичной функции в этом случае является функция, принимающая два аргумента.
Интуитивно понятно, что применение частичных функций говорит: «Если вы зафиксируете первый аргумент функции, вы получите функцию остальных аргументов». Например, если функция div обозначает операцию деления x / y , то div с параметром x, фиксированным равным 1 (т. е. div 1), является другой функцией: такой же, как функция inv , которая возвращает мультипликативную обратную величину своего аргумента, определенного по inv ( y ) знак равно 1/ y .
Практическая мотивация частичного применения заключается в том, что очень часто функции, полученные путем передачи некоторых, но не всех аргументов функции, оказываются полезными; например, во многих языках есть функция или оператор, похожие на plus_one
. Частичное применение упрощает определение этих функций, например, путем создания функции, которая представляет оператор сложения с привязанной к 1 единицей в качестве первого аргумента.
Частичное применение можно рассматривать как оценку каррированной функции в фиксированной точке, например, заданной и затем или просто где карри первый параметр f.
Таким образом, частичное применение сводится к каррированной функции в фиксированной точке. Кроме того, каррированная функция в фиксированной точке (тривиально) является частичным применением. Для дальнейшего доказательства отметим, что для любой функции , функция можно определить так, что . Таким образом, любое частичное применение может быть сведено к одной операции карри. Таким образом, карри более уместно определить как операцию, которая во многих теоретических случаях часто применяется рекурсивно, но которая теоретически неотличима (если рассматривать ее как операцию) от частичного применения.
Таким образом, частичное применение можно определить как объективный результат единичного применения оператора карри для некоторого упорядочения входных данных некоторой функции.
См. также
[ редактировать ]- Присоединение Тензор-хом
- Ленивая оценка
- Замыкание (информатика)
- см
n теорема - Замкнутая моноидальная категория
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с cdiggins (24 мая 2007 г.). "Каррирование != Обобщенное частичное приложение?!" . Lambda the Ultimate: блог о языках программирования .
- ^ Перейти обратно: а б с «Приложение с частичной функцией не выполняет карринг» . Невырезанный блок . 7 августа 2020 г. Архивировано из оригинала 23 октября 2016 г.
- ^ Перейти обратно: а б Баэз, Джон К.; Останься, Майк (6 июня 2009 г.). «Физика, топология, логика и вычисления: Розеттский камень». В Куке, Боб (ред.). Новые структуры для физики (PDF) . Конспект лекций по физике. Том. 813: Новые структуры для физики. Берлин, Гейдельберг: Springer (опубликовано 5 июля 2010 г.). стр. 95–172. arXiv : 0903.0340 . дои : 10.1007/978-3-642-12821-9_2 . ISBN 978-3-642-12821-9 . S2CID 115169297 . Архивировано из оригинала (PDF) 5 декабря 2022 года.
- ^ Перейти обратно: а б Фреге, «Хвала Богу» (1893). «§ 36» . Основные законы арифметики (на немецком языке). Книга из коллекции Университета Висконсина в Мэдисоне, оцифрована Google 26 августа 2008 г. Йена: Герман Поле. стр. 54–55.
- ^ Перейти обратно: а б с Куайн, Западная Вирджиния (1967). «Введение в книгу Моисея Шёнфинкеля 1924 года «О строительных блоках математической логики» ». Ван Хейеноорт, Жан (ред.). От Фреге до Гёделя: Справочник по математической логике, 1879–1931 . Издательство Гарвардского университета. стр. 355–357. ISBN 9780674324497 .
- ^ Шенфинкель, Моисей (сентябрь 1924 г.) [Представлено в Mathematicen Gesellschaft (Математическом обществе) в Геттингене 7 декабря 1920 г. Получено в журнал Mathematical Annals 15 марта 1924 г.]. Написано в Москве. «О строительных блоках математической логики » (PDF) . Математические летописи . 92 (3-4). Берлин?: Springer: 305–316. дои : 10.1007/BF01448013 . S2CID 118507515 .
- ^ Перейти обратно: а б Стрейчи, Кристофер (апрель 2000 г.) [Эта статья составляет суть курса лекций, прочитанных на Международной летней школе компьютерного программирования в Копенгагене в августе 1967 г.]. «Основные понятия языков программирования» . Вычисления высшего порядка и символьные вычисления . 13 :11–49. CiteSeerX 10.1.1.332.3161 . дои : 10.1023/А:1010000313106 . ISSN 1573-0557 . S2CID 14124601 .
Шёнфинкель разработал устройство для сведения операторов с несколькими операндами к последовательному применению операторов с одним операндом.
- ^ Перейти обратно: а б с Первоначально опубликовано как Рейнольдс, Джон К. (1 августа 1972 г.). «Определенные интерпретаторы языков программирования высшего порядка» . В Розмари Шилдс (ред.). Материалы ежегодной конференции ACM — ACM '72 . Том. 2. АСМ Пресс. стр. 717–740. дои : 10.1145/800194.805852 . ISBN 9781450374927 . S2CID 163294 .
В последней строке мы использовали трюк под названием Карринг (в честь логика Х. Карри) для решения проблемы введения бинарной операции в язык, где все функции должны принимать один аргумент. (Рефери отмечает, что, хотя «Карри» вкуснее, «Шенфинкелинг» может быть более точным.)
Переиздано как Рейнольдс, Джон К. (1998). «Определенные интерпретаторы языков программирования высшего порядка» . Вычисления высшего порядка и символьные вычисления . 11 (4). Бостон: Издательство Kluwer Academic: 363–397. дои : 10.1023/А:1010027404223 . 13 – через Сиракузский университет: Колледж инженерии и компьютерных наук – бывшие факультеты, центры, институты и проекты. - ^ Слоннегер, Кеннет; Курц, Барри Л. (1995). «Каррированные функции, 5.1: концепции и примеры, глава 5: лямбда-исчисление». Формальный синтаксис и семантика языков программирования: лабораторный подход (PDF) . Издательство Аддисон-Уэсли. п. 144. ИСБН 0-201-65697-3 .
- ^ Перейти обратно: а б с Карри, Хаскелл Б. (1980). Барвайз, Джон; Кейслер, Х. Джером; Кунен, Кеннет (ред.). «Некоторые философские аспекты комбинаторной логики». Симпозиум Клини: материалы симпозиума, состоявшегося 18-24 июня 1978 г. в Мэдисоне, Висконсин, США (Исследования по логике и основам математики) . Исследования по логике и основам математики. 101 . Издательство Северной Голландии, выходные данные Elsevier: 85–101. дои : 10.1016/S0049-237X(08)71254-0 . ISBN 9780444853455 . ISSN 0049-237X . S2CID 117179133 .
Некоторые современные логики называют такой взгляд на функцию «каррированием», потому что я широко его использовал; но Шенфинкелю пришла в голову эта идея примерно на 6 лет раньше меня.
- ^ «Карри Шенфинкеллинг» . Портлендского репозитория шаблонов Wiki . Cunningham & Cunningham, Inc., 6 мая 2012 г.
- ^ Барендрегт, Хенк; Барендсен, Эрик (март 2000 г.) [декабрь 1998 г.]. Введение в лямбда-исчисление (PDF) (пересмотренная редакция). п. 8.
- ^ Карри, Хаскелл; Фейс, Роберт (1958). Комбинаторная логика . Том. Я (2-е изд.). Амстердам, Нидерланды: Издательство Северной Голландии.
- ^ Хаттон, Грэм; Джонс, Марк П., ред. (ноябрь 2002 г.). «Часто задаваемые вопросы по comp.lang.functional, 3. Технические темы, 3.2. Каррирование» . Компьютерные науки Ноттингемского университета .
- ^ Хейм, Ирен; Кратцер, Анжелика (2 января 1998 г.). Семантика в порождающей грамматике (PDF) . Молден, Массачусетс: Blackwell Publishers, издательство Wiley. ISBN 0-631-19712-5 .
{{cite book}}
: CS1 maint: дата и год ( ссылка ) - ^ Тернер, Дэвид (1 июня 1997 г.). «Язык программирования, карринг или шонфинкелинг?, №9/14» . Форум по языкам компьютерного программирования . Архивировано из оригинала 3 марта 2022 года . Проверено 3 марта 2022 г.
- ^ Перейти обратно: а б Мэй, Джон Питер (1999). Краткий курс алгебраической топологии (PDF) . Чикагские лекции по математике. Чикаго, Иллинойс: Издательство Чикагского университета. стр. 39–55. ISBN 0-226-51183-9 . OCLC 41266205 .
- ^ «компактно порожденное топологическое пространство» . нЛаб . 28 мая 2023 г.
- ^ Тиллотсон, Дж.; Бут, Питер I. (март 1980 г.) [Поступило 2 октября 1978 г., исправлено 29 июня 1979 г., опубликовано 1 мая 1980 г.]. Написано в Мемориальном университете Ньюфаундленда. «Моноидальные замкнутые, декартово замкнутые и удобные категории топологических пространств» (PDF) . Тихоокеанский математический журнал . 88 (1). Беркли, Калифорния: Издательства Mathematical Sciences: 35–53. дои : 10.2140/pjm.1980.88.35 . eISSN 1945-5844 . ISSN 0030-8730 .
- ^ «удобная категория топологических пространств» . нЛаб . 11 августа 2023 г.
- ^ Перейти обратно: а б с Ротман, Джозеф Иона (1988). «Глава 11». Введение в алгебраическую топологию . Дипломные тексты по математике; 119. Нью-Йорк: Springer-Verlag. ISBN 978-0-387-96678-6 . OCLC 17383909 .
- ^ Барендрегт, Хендрик Питер (1984). «Теоремы 1.2.13, 1.2.14». Лямбда-исчисление: его синтаксис и семантика . Исследования по логике и основам математики. Том. 103 (Перед. ред.). Северная Голландия, отпечаток Elsevier. ISBN 978-0-444-87508-2 .
- ^ Мак Лейн, Сондерс; Мурдейк, Ике (1992). «Глава I. Категории функторов; разделы 7. Исчисление высказываний, 8. Алгебры Гейтинга и 9. Кванторы как сопряженные» . Пучки в геометрии и логике: первое введение в теорию топоса . Нью-Йорк: Springer-Verlag, часть Springer Science & Business Media. стр. 48–57. ISBN 978-0-387-97710-2 .
- ^ Абрамский, Самсон; Куке, Боб (5 марта 2007 г.). «Категорическая семантика квантовых протоколов». Логика в информатике (LICS 2004): Материалы 19-го ежегодного симпозиума IEEE, Турку, Финляндия, 2004] . Издательство Компьютерного общества IEEE. arXiv : Quant-ph/0402130 . дои : 10.1109/LICS.2004.1319636 .
- ^ Ли, Дж. Кей (15 мая 2013 г.). «Функциональное программирование за 5 минут» . Слайды .