stringtranslate.com

каррирование

В математике и информатике каррирование — это метод перевода функции , принимающей несколько аргументов , в последовательность семейств функций, каждое из которых принимает один аргумент.

В прототипном примере каждый начинается с функции , которая принимает два аргумента, один из и один из, и создает объекты в Каррированная форма этой функции рассматривает первый аргумент как параметр, чтобы создать семейство функций. Семейство организовано так что для каждого объекта существует ровно одна функция

В этом примере само становится функцией, которая принимает в качестве аргумента и возвращает функцию, которая сопоставляет каждую из них . Правильная нотация для выражения этого является многословной. Функция принадлежит набору функций. Между тем, она принадлежит набору функций. Таким образом, что-то, что отображается, будет иметь тип. С этим обозначением это функция, которая принимает объекты из первого набора и возвращает объекты из второго набора, и поэтому пишут : Это несколько неформальный пример; более точные определения того, что подразумевается под «объектом» и «функцией», приведены ниже. Эти определения варьируются от контекста к контексту и принимают разные формы в зависимости от теории, над которой работает человек.

Каррирование связано с частичным применением , но не совпадает с ним . [1] [2] Приведенный выше пример можно использовать для иллюстрации частичного применения; это очень похоже. Частичное применение — это функция , которая принимает пару и вместе в качестве аргументов и возвращает результат. Используя те же обозначения, что и выше, частичное приложение имеет сигнатуру. Написанное таким образом, можно считать, что приложение сопряжено с каррированием.

Каррирование функции с более чем двумя аргументами можно определить методом индукции.

Каррирование полезно как в практическом, так и в теоретическом плане. В языках функционального программирования и многих других он обеспечивает способ автоматического управления передачей аргументов функциям и исключениям. В теоретической информатике это дает возможность изучать функции с несколькими аргументами в более простых теоретических моделях, которые предоставляют только один аргумент. Наиболее общая основа для строгого понятия каррирования и некаррирования находится в закрытых моноидальных категориях , которые лежат в основе обширного обобщения соответствия доказательств и программ Карри-Ховарда на соответствие со многими другими структурами, включая квантовую механику, кобордизмы и теорию струн. . [3]

Концепция каррирования была введена Готтлобом Фреге , [4] [5] , развита Мозесом Шенфинкелем , [6] [5] [7] [8] [9] [10] [11] и далее развита Хаскеллом Карри . [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] Тогда — это присоединенный функтор , который отображает надстройки в пространства петель, а некаррирующий — двойственный. [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.

Таким образом, частичное применение сводится к каррированной функции в фиксированной точке. Кроме того, каррированная функция в фиксированной точке (тривиально) является частичным применением. Для дальнейшего доказательства отметим, что для любой функции можно определить такую ​​функцию , что . Таким образом, любое частичное применение может быть сведено к одной операции карри. Таким образом, карри более уместно определить как операцию, которая во многих теоретических случаях часто применяется рекурсивно, но которая теоретически неотличима (если рассматривать ее как операцию) от частичного применения.

Таким образом, частичное применение можно определить как объективный результат единичного применения оператора карри для некоторого упорядочения входных данных некоторой функции.

Смотрите также

Рекомендации

  1. ^ abc cdiggins (24 мая 2007 г.). «Каррирование != Обобщенное частичное приложение?!». Lambda the Ultimate: блог о языках программирования .
  2. ^ abc «Приложение с частичной функцией не каррирует» . Невырезанный блок . 7 августа 2020 г. Архивировано из оригинала 23 октября 2016 г.
  3. ^ Аб Баэз, Джон К.; Останься, Майк (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 года.
  4. ^ аб Фреге, Готтлоб (1893). «§ 36». Grundgesetze der arithmetik (на немецком языке). Книга из коллекций Университета Висконсина в Мэдисоне, оцифрована Google 26 августа 2008 г. Йена: Герман Поле. стр. 54–55.
  5. ^ abc Куайн, Западная Вирджиния (1967). «Введение к книге Моисея Шёнфинкеля 1924 года «О строительных блоках математической логики»". Ин ван Хейеноорт, Жан (ред.). От Фреге до Гёделя: Справочник по математической логике, 1879–1931 . Издательство Гарвардского университета. Стр. 355–357. ISBN 9780674324497.
  6. ^ Шёнфинкель, Моисей (сентябрь 1924 г.) [Представлено в Mathematischen Gesellschaft (Математическом обществе) в Геттингене 7 декабря 1920 г. Получено в Mathematische Annalen 15 марта 1924 г.]. Написано в Москве. «Über die Bausteine ​​der mathematischen Logik» [О строительных блоках математической логики] (PDF) . Математические Аннален . Берлин?: Шпрингер. 92 (3–4): 305–316. дои : 10.1007/BF01448013. S2CID  118507515.
  7. ^ ab Стрейчи, Кристофер (апрель 2000 г.) [Эта статья составляет суть курса лекций, прочитанных на Международной летней школе компьютерного программирования в Копенгагене в августе 1967 г.]. «Фундаментальные концепции языков программирования». Вычисления высшего порядка и символьные вычисления . 13 :11–49. CiteSeerX 10.1.1.332.3161 . дои : 10.1023/А: 1010000313106. ISSN  1573-0557. S2CID  14124601. Существует устройство, разработанное Шенфинкелем, для сведения операторов с несколькими операндами к последовательному применению операторов с одним операндом. 
  8. ^ abc Первоначально опубликовано как Рейнольдс, Джон К. (1 августа 1972 г.). «Определенные интерпретаторы языков программирования высшего порядка». В Розмари Шилдс (ред.). Материалы ежегодной конференции ACM - ACM '72. Том. 2. АСМ Пресс. стр. 717–740. дои : 10.1145/800194.805852. ISBN 9781450374927. S2CID  163294. В последней строке мы использовали трюк под названием Currying (в честь логика Х. Карри) для решения проблемы введения бинарной операции в язык, где все функции должны принимать один аргумент. (Рефери отмечает, что, хотя «Карри» вкуснее, «Шенфинкелинг» может быть более точным.)Переиздано как Рейнольдс, Джон К. (1998). «Определенные интерпретаторы языков программирования высшего порядка». Вычисления высшего порядка и символьные вычисления . Бостон: Академическое издательство Kluwer. 11 (4): 363–397. дои : 10.1023/А: 1010027404223. 13 – через Сиракузский университет: Колледж инженерии и компьютерных наук – бывшие факультеты, центры, институты и проекты.
  9. ^ Слоннегер, Кеннет; Курц, Барри Л. (1995). «Каррированные функции, 5.1: концепции и примеры, глава 5: лямбда-исчисление». Формальный синтаксис и семантика языков программирования: лабораторный подход (PDF) . Издательство Аддисон-Уэсли. п. 144. ИСБН 0-201-65697-3.
  10. ^ abc Карри, Хаскелл Б. (1980). Барвайз, Джон; Кейслер, Х. Джером; Кунен, Кеннет (ред.). «Некоторые философские аспекты комбинаторной логики». Симпозиум Клини: материалы симпозиума, состоявшегося 18-24 июня 1978 г. в Мэдисоне, Висконсин, США (Исследования по логике и основам математики) . Исследования по логике и основам математики. Издательство Северной Голландии, издательство Elsevier. 101 : 85–101. дои : 10.1016/S0049-237X(08)71254-0. ISBN 9780444853455. ISSN  0049-237X. S2CID  117179133. Некоторые современные логики называют этот способ рассмотрения функции «каррированием», потому что я широко его использовал; но Шенфинкелю пришла в голову эта идея примерно на 6 лет раньше меня.
  11. ^ "Карри Шонфинкеллинг" . Wiki Портлендского репозитория шаблонов . Cunningham & Cunningham, Inc., 6 мая 2012 г.
  12. ^ Барендрегт, Хенк; Барендсен, Эрик (март 2000 г.) [декабрь 1998 г.]. Введение в лямбда-исчисление (PDF) (пересмотренная редакция). п. 8.
  13. ^ Карри, Хаскелл; Фейс, Роберт (1958). Комбинаторная логика . Том. Я (2-е изд.). Амстердам, Нидерланды: Издательство Северной Голландии.
  14. ^ Хаттон, Грэм; Джонс, Марк П., ред. (ноябрь 2002 г.). «Часто задаваемые вопросы по comp.lang.functional, 3. Технические темы, 3.2. Каррирование». Компьютерные науки Ноттингемского университета .
  15. ^ Хайм, Ирен; Кратцер, Анжелика (2 января 1998 г.). Семантика в порождающей грамматике (PDF) . Молден, Массачусетс: Blackwell Publishers, издательство Wiley. ISBN 0-631-19712-5.{{cite book}}: CS1 maint: date and year (link)
  16. Тернер, Дэвид (1 июня 1997 г.). «Язык программирования, карринг или шёнфинкелинг?, №9/14». Форум по языкам компьютерного программирования . Архивировано из оригинала 3 марта 2022 года . Проверено 3 марта 2022 г.
  17. ^ аб Мэй, Джон Питер (1999). Краткий курс алгебраической топологии (PDF) . Чикагские лекции по математике. Чикаго, Иллинойс: Издательство Чикагского университета. стр. 39–55. ISBN 0-226-51183-9. ОСЛК  41266205.
  18. ^ «Компактно сгенерированное топологическое пространство». нЛаб . 28 мая 2023 г.
  19. ^ Тиллотсон, Дж.; Бут, Питер I. (март 1980 г.) [Поступило 2 октября 1978 г., исправлено 29 июня 1979 г., опубликовано 1 мая 1980 г.]. Написано в Мемориальном университете Ньюфаундленда. «Моноидальные замкнутые, декартово замкнутые и удобные категории топологических пространств» (PDF) . Тихоокеанский математический журнал . Беркли, Калифорния: Издательство математических наук. 88 (1): 35–53. дои : 10.2140/pjm.1980.88.35. eISSN  1945-5844. ISSN  0030-8730.
  20. ^ «Удобная категория топологических пространств». нЛаб . 11 августа 2023 г.
  21. ^ abc Ротман, Джозеф Иона (1988). «Глава 11». Введение в алгебраическую топологию. Дипломные тексты по математике; 119. Нью-Йорк: Springer-Verlag. ISBN 978-0-387-96678-6. ОСЛК  17383909.
  22. ^ Барендрегт, Хендрик Питер (1984). «Теоремы 1.2.13, 1.2.14». Лямбда-исчисление: его синтаксис и семантика . Исследования по логике и основам математики. Том. 103 (Перед. ред.). Северная Голландия, отпечаток Elsevier. ISBN 978-0-444-87508-2.
  23. ^ Мак Лейн, Сондерс; Мурдейк, Ике (1992). «Глава I. Категории функторов; разделы 7. Исчисление высказываний, 8. Алгебры Гейтинга и 9. Кванторы как сопряженные». Пучки в геометрии и логике: первое введение в теорию топоса . Нью-Йорк: Springer-Verlag, часть Springer Science & Business Media. стр. 48–57. ISBN 978-0-387-97710-2.
  24. ^ Абрамский, Самсон; Куке, Боб (5 марта 2007 г.). «Категорическая семантика квантовых протоколов». Логика в информатике (LICS 2004): Материалы 19-го ежегодного симпозиума IEEE, Турку, Финляндия, 2004] . Издательство Компьютерного общества IEEE. arXiv : Quant-ph/0402130 . дои : 10.1109/LICS.2004.1319636.
  25. Ли, Дж. Кей (15 мая 2013 г.). «Функциональное программирование за 5 минут». Слайды .

Внешние ссылки