n实验室monad(计算机科学)

目录

此条目是关于单子如已知范畴代数但在应用于计算机科学。另请参阅单音(消歧).


上下文

计算

范畴代数

类型理论

自然扣除 元语言,实用基础

  1. 类型形成规则
  2. 术语引入规则
  3. 术语消除规则
  4. 计算规则

类型理论(依赖的,紧张的,观测类型理论,同伦型理论)

语法 目标语言

计算三位一体=
命题作为类型+程序作为证据+关系类型理论/范畴理论

逻辑集合论(内部逻辑第页,共页)范畴理论类型理论
命题设置对象类型
谓语集合族显示形态从属类型
证明要素广义元素学期/程序
切割规则作文属于对形态进行分类/拉回属于显示地图替代
引入规则对于含义科尼特用于hom传感器附加λ
消除规则对于含义单元用于hom传感器附加应用
切割消除对于含义其中一个锯齿形恒等式用于hom传感器附加β还原
身份消除含义其他的锯齿形身份用于hom传感器附加eta转换
真的单子终端对象/(-2)-截断对象h级0-类型/单元类型
空集合初始对象空类型
命题,真值subsingleton公司次终端对象/(-1)-截断对象h-命题,纯粹命题
逻辑连词笛卡尔积产品产品类型
分离不相交联合(支持第页,共页)副产物((-1)-截断第页,共页)总和类型(支架式第页,共页)
含义功能集(进入subsingleton公司)内部hom(进入次终端对象)函数类型(进入h-命题)
否定功能集进入之内空集合内部hom进入之内初始对象函数类型进入之内空类型
通用量化编入索引的笛卡尔积(属于子角体)从属产品(属于次终端对象)依赖产品类型(属于h-命题)
存在量词编入索引的不相交联合(支持第页,共页)相依和((-1)-截断第页,共页)相依和类型(支架式第页,共页)
逻辑等价双射集同构对象等价类型
支架组支持对象/(-1)-截断命题截断/支架式
n个图像属于同构进入之内终端对象/n截断n截断模态
平等对角线函数/对角线子集/对角线关系路径空间对象身份类型/路径类型
完全呈现集设置离散对象/0-截断的对象h级2-类型/设置/h组
设置设置具有等价关系内部0-广群Bishop集合/刚毛状的用它伪等效关系实际的等价关系
等价类/商集合商类型
归纳上极限感应式,W型,M型
较高的归纳高等大肠杆菌高电感型
-0截断 高等大肠杆菌商归纳型
造币术限制共导型
预设类型没有身份类型
设置属于真理价值观子对象分类器命题类型
话语领域宇宙对象分类器类型universe
模式闭合算子, (幂等元)单子模态类型理论,monad(计算机科学)
线性逻辑(对称的,关闭)单体范畴线性类型理论/量子计算
防护网字符串关系图量子电路
(缺席)收缩规律(缺席)对角线的无克隆定理
综合数学领域专用嵌入式编程语言

同伦能级

语义学

目录

想法

计算机科学,一个(钴-)单子(或(钴-)Kleisli三重,或(共同)扩展系统)是一种数据类型-描述“计算概念”的结构[莫吉(1989),莫吉(1991)]可能“具有外部影响或受到外部环境/原因的影响”,例如涉及随机存取存储器,输入/输出,异常处理,正在写入从中读取全局变量等命令式编程但被转换为具有确定性和可证实的行为,风格为函数式编程.

简而言之,一个(“扩展系统-样式“[马内斯(1976),例3.12]或“Kleisli三重-样式“[Moggi(1991),定义1.2])单子在给定的程序设计语言包括作业(但请参见在下面):

  1. 到任何数据 类型 D类D类新数据类型的(D类)\数学{E}(D)第页,共页“D类D类-具有的数据\数学{E}-效果”,

  2. 到任何一对属于\数学{E}-有效的功能表单的(程序)掠夺 12:D类 1(D类 2)程序{12}\,冒号\,D_1\到mathcal{E}(D_2)掠夺 23:D类 2(D类 )程序{23}\,冒号\,D_2\到mathcal{E}(D_3)有效复合函数的绑定 掠夺 23掠夺 12():D类 1(D类 )绑定^{\mathcal{E}}程序{23}\;\电路\;程序{12}(-)\,\冒号\,D_1\到\数学{E}(D_3)(他们的结合克莱斯利成分),

  3. 到任何数据 类型 D类D类函数的转塔 D类 :D类(D类)ret^{mathcal{E}}_D\;\冒号\;D\to\mathcal{E}(D)分配“琐碎”\数学{E}-效果”,

这样,绑定相联的还有单作的关于返回操作,因此数据类型具有\数学{E}-它们之间的有效程序构成类别(该Kleisli类别给定效果/单子\数学{E}).

我们现在更详细地解释这意味着什么以及它有什么好处。

基本思想:单子效应

编程通常情况下程序具有“标称”输出数据类型 D类D类 事实上的输出某些修改类型的数据T型(D类)T(D)这说明了该计划造成的“外部影响”,其中

(1)D类(D类)D\;\地图\;\数学{E}(D)

是发送一般操作吗数据类型 D类D类到新数据类型(D类)\数学{E}(D).

例如,如果在计算其标称输出数据的同时d日:D类d\冒号d程序还写入日志消息消息:消息\,\冒号\, 字符串,则其实际输出数据为一对 (d日,消息)(d,味精)属于产品类型 写入(D类)D类×字符串写入(D)\,\coloneqq \,D\次字符串.

或者,如果程序可能失败,而“抛出例外消息“消息:消息\,\冒号\, 字符串,则其实际输出数据为任何一个 d日:D类d\冒号d 消息:字符串消息\冒号字符串,因此属于副产品类型 Excep公司(D类)D类字符串Excep(D)\,\coloneqq\,D\sqcup字符串.

给定这样一个\数学{E}-有效程序掠夺 12:D类 1(D类 2)程序{12}\;\冒号\;D_1到mathcal{E}(D_2)并给出了后续程序掠夺 23:D类 2(D类 )程序{23}\,\冒号\,D_2 \到\数学{E}(D_3)接受类型的标称输入数据D类 2D_2(D_2)而且它本身可能涉及到类型的进一步影响()\数学{E}(-),然后是天真 作文这两个程序中没有任何意义(除非(D类)=D类\数学{E}(D)=D实际上是一种微不足道的效果),但它们很明显有意的显然,通过以下方法可以获得成分:

  1. 第一次调整掠夺 23程序_{23}通过给定的处方

    (2)掠夺绑定 掠夺,\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!程序\;\地图\;绑定^{\mathcal{E}}程序\,,

    这样的话绑定 掠夺 23:(D类 2)(D类 )将^{\mathcal{E}}prog_23}\,\colon\,\mathcal{E}(D_2)\绑定到\mathcali{E}\(D_3):

    1. 不接受类型为的数据(D类 2)\数学{E}(D_2)

    2. “充当掠夺 23程序{23}虽然运送任何以前的\数学{E}-影响”(这种直觉在下面成为一个正式的事实(9));

  2. 然后形成天真作文 绑定 掠夺 23掠夺 12绑定^{\mathcal{E}}程序{23}\;\电路\;程序{12}

如下:

(注意,我们用“绑定 掠夺()绑定^{\mathcal{E}}程序(-)“里面有什么程序设计语言喜欢哈斯克尔 表示为(-)>>=编程又称“鱼记法”,例如。Milewski 2019第321页一些作者用上标表示,”掠夺 *程序^\ast\,“,例如。莫吉(1991)乌斯塔鲁(2021),第1讲,第12页.)

根据这些程序的预期行为,仍需具体说明绑定 掠夺 23绑定^{\mathcal{E}}程序{23}“携带()\数学{E}(-)-影响”,因此“绑定”操作是什么(2)具体来说。

例如,在上面的日志效果示例中,其中写入(D类 2)D类 2×字符串写入(D_2)\,\coloneqq \,D_2\times字符串,显而易见的方法是使用串联 字符串×字符串凹面(concat)字符串String\times String\xrightarrow{\;concat\;}字符串并设置:

绑定 写入掠夺 23D类 2×字符串掠夺 23×身份证件 字符串D类 ×字符串×字符串身份证件 D类 ×凹面(concat)D类 ×字符串.绑定^{Write}程序{23}\;\冒号\;D_2\times String\xrightarrow{prog_{23}\times Id_{String}}D_3\times字符串\times String\xright箭头{Id_{D_3}\times-concat}D_3\t字符串\,。

在上面的另一个示例中,其效果是可能抛出例外信息,传递这种效果的明显方式是使用共对角线的 :字符串字符串字符串\nabla\,\colon\,String\sqcup String\转换为String,相当于继续转发已引发的异常(如果有):

绑定 Excep公司掠夺 23D类 2字符串掠夺 23身份证件 字符串D类 字符串字符串身份证件 D类 D类 字符串.绑定^{Excep}程序{23}\;\冒号\;D_2\sqcup String\xrightarrow{prog_{23}\sqcupId_{String}D_3\sqcup-String\sqcup-String\xrightarrow}Id_{D_3}\sqcup\nabla}D_3\squap-String\,。

无论选择什么样的设计来“传递效果”,都必须将该方法应用于三倍的属于\数学{E}-名义上可组合的有效程序,则其有效组合应明确定义为相联的,满足以下要求方程式–这里称为第一个“单子定律”:

(3)绑定 掠夺 34(绑定 掠夺 23掠夺 12)=绑定 (绑定 掠夺 34掠夺 23)掠夺 12.绑定^{\mathcal{E}}程序{34}\;\电路\;\大(绑定^{\mathcal{E}}程序{23}\;\电路\;程序{12}\大)\;\;\;=\;\;\;绑定^{\mathcal{E}}\大(绑定^{\mathcal{E}}程序{34}\;\电路\;程序{23}\大)\;\电路\;程序{12}\,.

最后,为了使这种有效程序的概念有效地连接到没有效果的“纯”程序,对于任何程序来说都应该是这样的掠夺 01:D类 0D类 1程序{01}\,冒号\,D_0\xrightarrow{\;}D_1碰巧没有\数学{E}-效果,我们有一个如何将其视为\数学{E}-以琐碎的方式执行有效的程序。为此,应定义一个操作

(4)转塔 D类:D类(D类)ret_{D}\;\冒号\;D\xrightarrow{\;}\mathcal{E}(D)

它只“返回”类型的数据D类D类,但被重新视为有效(D类)\数学{E}(D)-琐碎的数据;这样我们就可以构建一个微不足道的有效程序转塔 D类 1 𝒟掠夺 01:D类 0(D类 1)ret^{mathcal{D}}_{D_1}prog_{01}\;\冒号\;D_0\xrightarrow{\;}\mathcal{E}(D_1).

例如,在上面的日志消息效果示例中,这将是操作D类D类×字符串D\到D\倍字符串分配空的 一串 转塔 写入:d日(d日,)ret^{Write}\;\冒号\;d\mapsto(d,\varnothing).

在上面的另一个示例中异常处理,微不足道的影响D类D类字符串D\to D\sqcup字符串只是不抛出异常,这只是转塔 Excep公司:d日d日ret^{Excep}\;\冒号\;d\mapsto天(右边共投影进入副产物).

最后的一致性条件(即剩余的“单子定律”)是“携带琐碎效应确实是琐碎操作”,即

(5)绑定 掠夺 01转塔 D类 0()=掠夺 01绑定 转塔 D类 1掠夺 01()=掠夺 01.绑定^{\mathcal{E}}程序{01}\;\电路\;ret_{D_0}(-)\;=\;程序{01}\;\;\;\;\;\;\;\;\;\文本{和}\;\;\;\;\;\;\;\;\;绑定^{\mathcal{E}}重试{D_1}\;\电路\;程序{01}(-)\;=\;程序{01}\,.

请注意结合性条件(3)统一性条件(5)共同等同于说数据类型具有家庭成员属于\数学{E}-在上述意义上,它们之间的有效程序形成了一个类别.英寸范畴理论这被称为Kleisli类别 Kl公司()Kl(\mathcal{E})单子 \数学{E}类别 类型类型属于数据类型中间有程序:

(6)对象(Kl公司()) = 对象(类型) 霍姆(Kl公司())(D类 1,D类 2) = 霍姆(类型)(D类 1,(D类 2)) () Kl公司()() = () 类型绑定 ().\开始{array}{rcl}Obj\Big(Kl(\mathcal{E})\Big)&\;\;=\;\;&对象\大(类型\大)\\Hom\Big(Kl(\mathcal{E})\Big)\Big(D_1,\,D_2\Big)&\;\;=\;\&Hom\大(类型\大)\大(D_1,\,\数学{E}(D_2)\大)\\(-)\circ_{\mathrm{Kl}(\mathcal{E})}(-)&\;\;=\;\;&(-)\circ_{Type}绑定^{\mathcal{E}}(-)\,.\结束{数组}

传统上在范畴理论,的公理单子以不同的方式呈现,调用monad“product”自然转化 μ\数学{E}\circ\mathcal{E}\右箭头{\mu}\mathcal{E}而不是“绑定”操作。我们可以很容易地检查单体的这两个公理表示实际上是相等的-参见(7)下面–,但上面“Kleisli三重/扩展系统“-演示通常与函数式编程.

总之,可以选择作业(但请参见在下面)至数据类型 D类 i(_i)属于

  1. (D类):类型\数学{E}(D)\;\冒号\;类型,

    即类型\数学{E}-名义类型的有效数据D类D类 (1)

  2. 绑定 D类 1,D类 2 :霍姆(D类 1,(D类 2))霍姆((D类 1),(D类 2))绑定^{\mathcal{E}}_{D_1,D_2}\;\冒号\;Hom\big(D_1,\,\mathcal{E}(D_2)\big)\longrightarrow-Hom\big,

    即如何执行程序,同时执行任何先前的效果(2)

  3. 转塔 D类 :D类(D类)ret^{mathcal{E}}_D\;\冒号\;D\to\mathcal{E}(D),

    即如何看待平淡D类D类-数据的影响微不足道(4)

从属于:

  1. 这个结合性条件(3)

  2. 这个统一性条件(5)

称为计算机科学中的单子(同时:“Kleisli三重“在中函数式编程)并用于编码所有程序都可能受到外部效应某种程度上\数学{E}这是由上面选择的monad操作指定的。

这里,暂时(但请参阅在下面),我们写霍姆(D类 1,D类 2)Hom(D_1、D_2)对于设置获取类型数据的程序/函数D类 1D_1到的数据D类 2D_2(D_2)(该hom集合在平原上类别属于类型).

上面的第一个运行示例称为作家莫纳德,因为它对程序可能具有将消息字符串写入给定缓冲区的附加效果的情况进行编码。

上面的另一个运行示例自然称为异常单子.


与单体的其他常见公理的关系。上述Kleisli/扩展结构,使克莱斯利风格 计算机科学中的单子、可能和经常以不同的等效方式编码:

或者假设操作

  1. D类(D类)D\mapsto\mathcal{E}(D)(和以前一样)

  2. 功能性维修计划 D类 1,D类 2 :霍姆(D类 1D类 2)霍姆((D类 1),(D类 2))fmap^{\mathcal{E}}_{D_1,D_2}\;\冒号\;Hom\big(D_1\到D_2\big)\longrightarrow Hom\big

  3. 转塔 D类 :D类(D类)ret ^{\mathcal{E}}_D\;\冒号\;D\to\mathcal{E}(D)

  4. 参加 D类 :((D类))(D类)连接^{\mathcal{E}}_D\;\冒号\;\mathcal{E}\big(\mathcal}(D)\big)\to\mathcal{E}(D)

这样的话

  1. 功能地图 格式映射^{\mathcal{E}}函子数据类型,

  2. 参加 加入^{\mathcal{E}}相联的单作的(关于转塔转塔)作为自然转化,

产生的定义单子更传统地用于范畴理论(即作为幺半对象 在里面 内函子在平原上类别属于数据类型).

直接检查表明不切实际地使…变形绑定绑定-和参加参加-通过将操作符表示为以下组合(使用范畴理论-符号,例如“ev”表示评估图):

(7) 功能性维修计划 D类 1,D类 2 :霍姆(D类 1,D类 2)转塔()霍姆(D类 1,(D类 2))绑定霍姆((D类 1),(D类 2)) 参加 D类 :((D类))(身份证件 (D类),名称(身份证件 D类))D类×霍姆((D类),(D类))绑定(D类) 反之亦然: 绑定 D类,D类 :(D类)×霍姆((D类),(D类))(身份证件 D类,功能性维修计划 D类,D类)(D类)×霍姆((D类),(D类))电动汽车(D类)参加D类.\开始{array}{ll}&fmap^{\mathcal{E}}_{D_1,D_2}\;\冒号\;Hom\big(D_1,D_2\big)\xrightarrow{ret\circ(-)}Hom\big(D_1,\,\mathcal{E}(D_2)\big)\xrightarrow{bind}(右箭头{绑定})Hom\big(\mathcal{E}(D_1),\,\mathcal{E}(D_2)\big)\\&加入^{\mathcal{E}}_D\;\冒号\;\mathcal{E}\big(\mathcal}(D)\big)\x向右箭头{\大(id_{\mathcal{E}\mathcal{E}(D)},名称(id_{\mathcal{E}D})\大)}\mathcal{E}\mathcal{E}D\times Hom\big(\mathcal{E}(D),\,\mathcali{E}(D)\big)\xrightarrow{bind}(右箭头{绑定})\数学{E}(D)\\\文本{反之:}\\&绑定^{\mathcal{E}}_{D,D'}\;\冒号\;\mathcal{E}(D)\times Hom\big(\mathcal}E}\x向右箭头{\大(id_{\mathcal{E}D},fmap_{D,\mathcal{E}D’}\大)}\mathcal{E}(D)\times Hom\big(\mathcal}E}\xrightarrow{\;电动汽车\;}\mathcal{E}\mathcal}(D')\xrightarrow{\;连接\;}D’\,.\结束{数组}

精致理念:强单子

但事实上函数式程序设计-语言人们通常考虑上述情况的增强版本:

在这些高阶语言中,除了(霍姆-)设置程序/功能霍姆(D类 1,D类 2)Hom\big(D_1,\,D_2\big)也是实际的数据类型函数,即函数类型 D类 1D类 2D_1\至D_2,就以下方面而言范畴语义学内部hom-对象 地图(D类 1,D类 2)地图(D_1,\,D_2)在中笛卡尔闭范畴属于数据类型因此,在这些语言中(例如哈斯克尔)的类型给定的绑定操作的数据类型 D类 1D_1,D类 2D_2(D_2)实际上被认为是函数类型/内部hom

绑定 D类 1,D类 2 : (D类 1(D类 2))((D类 1)(D类 2)) (D类 1)×(D类 1(D类 2))(D类 2) (D类 1)((D类 1(D类 2))(D类 2))\开始{array}{ll}绑定^{\mathcal{E}}_{D_1,D_2}\;\冒号\;&&\大(D_1到mathcal{E}(D_2)\大)\至\大(\数学{E}(D_1)\至\数学{E}(D_2)\大)\\&\西马克&\数学{E}(D_1)\次\大(D_1到mathcal{E}(D_2)\大)\至\数学{E}(D_2)\\&\simeq(模拟)&\数学{E}(D_1)\至\大(\大(D_1到mathcal{E}(D_2)\大)\至\数学{E}(D_2)\大)\结束{数组}

(我们使用同源异形产品\仪表盘内部hom-附加重新识别类型右侧)

这句话(当心)传统上没有很多括号,如下所示:

绑定 D类 1,D类 2 :D类 1(D类 1D类 2)D类 2.绑定^{\mathcal{E}}_{D_1,D_2}\;\冒号\;\数学{E}D_1\至\大(D_1\至\数学{E}D_2\大)\至\数学{E}D_2\,.

一般情况下(除了基本地形属于集合),这样一个迭代函数类型/内部hom比相应的平原丰富(当然不同于)hom集合,并相应地定义为“Kleisli三元组”,但绑定操作键入如下内部的方式是更富有的更强 结构而不是平原单子关于类型的基本范畴:即它是一个浓缩单子同等地强单子关于自己-丰富对称单体闭范畴类型的(莫吉1991§3,参见。Goubault-Larrecq,Lasota&Nowak 2002年,McDermott&Uustalu(2022年)).

在这样一个丰富/强monad,绑定操作定义为以下组合:

(D类 1)×地图(D类 1,D类 2)力量 (D类 1×地图(D类 1,D类 2))评估 D类 1,D类 2D类 2μ D类 2D类 2.\数学{E}(D_1)\times\mathcal{E}Map(D_(1),\,D_2)\xrightarrow{\;strongth_{\mathcal{E}}\;}\mathcal{E}\big(D_1\times映射(D_1,\,\mathcal}D_2)\big)\x向右箭头{\数学{E}评估{D_1,\mathcal{E}D_2}} \mathcal{E}\数学{E}D_2\xrightarrow{\;\mu_{D_2}\;} \数学{E}D_2\,.

特别是,在函数式编程语言喜欢哈斯克尔以这种方式,它们是真正的强健/丰富的单子。

在这种情况下,在大多数默认讨论中对称单体闭范畴类型的假定为笛卡尔闭合(“经典类型”),但在线性类型理论(例如量子计算)它可以是非笛卡尔的(或者两者都是:cf。双闭单体范畴).


然而,关于效应单体的更多结构可在依赖型理论具有类型universes,其中可能会要求monad操作D类T型(D类)D映射到T(D)不仅仅是一个内函数设置属于类型,但一个自同态类型universe。至少对于幂等单子本案将在反射子宇宙模态类型理论也许还有其他地方。

进一步想法:Monad模块

在实践中进一步编程:如果程序可能导致外部影响,如在上面,那么人们通常会想要一些手柄这些影响。

这在在上面运行示例例外其整个设计目的通常是在它们出现时进行处理。

自从“处理”\数学{E}-效果应该意味着这些都是用一些实际的纯数据来完成的类型 D类D类,一个\数学{E}-数据类型上的效果处理程序D类D类应该主要由以下形式的程序组成

(D类)D类.\数学{E}(D)到D\,.

处理由\数学{E}-有效的程序D类(D类)D'\到\数学{E}(D)把它们变成纯粹的计算D类D类D’至D.

但除此之外,这样的处理程序需要处理已经“携带”的效果(2)从以前的计算中,甚至在其他有效的计算中掠夺 0,1:D类 0D类 1程序{0,1}\;\冒号\;D_{0}\到D_{1}; 因此,所有这些都需要分配处理程序:

高密度脂蛋白 D类 2 掠夺 1,2:(D类 1)D类 2.hndl^{\mathcal{E}}_{D_2}程序{1,2}\;\冒号\;\数学{E}(D_1)\到D_2\,.

在这种效果处理选择中,一致性要求:

  1. 首先处理之前的所有影响(2)然后通过给定的掠夺:D类(D类)prog\,\colon\,D\到\mathcal{E}(D')结果与出租相同掠夺掠夺通过传递给掠夺[]程序[-]然后立即处理产生的累积:

  2. 处理这种微不足道的影响不应该是额外的操作:

(8)

由此类赋值组成的数据结构高密度脂蛋白 hndl^{\mathcal{E}}受这些“法律”的约束Kleisli三代数(例如。乌斯塔鲁(2021),Lec。2)或可拓系统上的代数(请参见在这里)的\数学{E}与传统的范畴理论被称为代数 \数学{E} \数学{E}-代数或者,最好是:\数学{E}-模块\数学{E}-模态类型.

给定一个一对这样的\数学{E}-模态类型 (D类 1,高密度脂蛋白 D类 1 )\big(D_1,hndl^{\mathcal{E}}_{D_1}\big),(D类 2,高密度脂蛋白 D类 2 )\大(D_2,hndl^{\mathcal{E}}_{D_2}\big),一个函数ϕ:D类 1D类 2\φ,冒号,D_1到D_2是一个同态如果处理结果\数学{E}-使用前后的效果ϕ是相同的,因此如果对于所有函数(f):D类 0D类 1f\,\冒号\,D_0\到D_1以下内容图表通勤:


免费\数学{E}-效果处理程序。请注意在上面我们已经启动了绑定操作(2)作为一种\数学{E}-效果处理:即作为前一个的“延续”\数学{E}-效果。这种直觉现在变成了一种精确的说法:

对于任何D类 2:类型D_2\;\冒号\;类型我们可以用重言式处理(8) \数学{E}-通过将其吸收到数据类型中而产生的效果(D类 2)\数学{E}(D_2),effecthandler只是effect-binding操作(2):

(9)高密度脂蛋白 (D类 2) (D类 1掠夺(D类 2))绑定 掠夺:(D类 1)(D类 2).hndl^{\mathcal{E}}_{\matchcal{E}(D_2)}\大(D_1\xrightarrow{prog}(右箭头{程序})\数学{E}(D_2)\大)\;\冒号\;绑定^{\mathcal{E}}掠夺\;\冒号\;\数学{E}(D_1)\至\数学{E}(D_2)\,.

这个\数学{E}-效应手(8)以这种方式出现称为自由的.

这个完整子范畴的免费\数学{E}-效果处理程序全部的 \数学{E}-模态类型被称为Kleisli类别.由克莱斯利等价,这是相等的(普通)类别(6)属于\数学{E}-我们开始的有效程序。这意味着:

  • 普通数据类型\数学{E}-它们之间的有效程序是等价的数据类型,可以自由地使用\数学{E}-效果处理程序。

这很有道理。


双重理念:共鸣背景

(来自奥弗顿2014)

形式对偶,所有上述讨论都有双重版本,其中现在(例如。乌斯塔卢和维尼(2008),POM13型,GKOBU16号机组,20韩元):

  • 共聚单体编码计算上下文(协同效应),

  • 他们的副产物操作是复制(共同加入)用于以下目的的上下文延伸(共结合)连续程序的上下文,

  • 余弦上的余模是数据结构提供(共同手柄)这样的背景。

更详细地说:

  • 除此之外,我们还有:

    • A类克莱斯利地图对于单子 \数学{E}是一个程序

      掠夺:D类(D类)程序\;\冒号\;D\to\mathcal{E}(D')

      造成外部\数学{E}-效果。

    • Kleisli模块单子 T型\马查尔{E} T型是处方

      高密度脂蛋白 D类 身份证件 D类:(D类)D类hdl ^{\mathcal{E}}_D id_D\;\冒号\;\数学{E}(D)到D

      对于搬运这样的\数学{E}-效果。

  • 现在双重地:


句法思想:Do-notation

最后,将所有这些转化为有效的程序设计语言只需声明方便语法用于表示克莱斯利成分.

其中一种语法称为“do表示法“(以”{...}“而不是”“由Launchbury 1993§3.3,然后由提升马克·琼斯20世纪90年代[HHPW07,第25页]并被采纳哈斯克尔在里面版本1.3,请参阅Benton,Hughes&Moggi 2002年第70页,Milewski 2019第20.3条)旨在共同表达:

  1. 连续的Kleisli作文,比如“做这个,做那个,然后返回结果”,

  2. 作为“提取”a的任何中间绑定操作D类D类-基准d日d日中的(D类)\数学{E}(D)-基准E类E类带符号d<-E

句法上,do-notation如下语法甜头对于组合克莱斯利成分变量绑定:

  1. do程序 \;\;\等同\;\; 掠夺

  2. 做prog1程序2 \;\;\等同\;\; prog1绑定(\_->prog2)

  3. do(x<-prog1)程序2 \;\;\等同\;\; prog1绑定(\x->prog2)

首先,这是一个暗示符号(实际上是一个“领域专用嵌入式编程语言“,请参阅那里)用于表达效应结合:

但因此,它还提供了一种方便的方法,通过连续地“调用”单独的过程来简单地表达连续的克莱斯利构图,其风格主要是命令式编程(因此由pure模拟/封装函数式编程):

但符号变得更具启发性,因为“<-“对于具有微小输入或输出(即单元类型 *\上一次)除了他们\数学{E}-效果,如本例所示:

这个案例清楚地显示了环境返回“-syntax块表示任意数量的\数学{E}-有效的程序。

除此之外,“<-“-语法意在暗示读出一个值。这是准确的图像状态monad(及其对IO-monad公司),其中从读/写全局变量的两个pasic操作

阅读 : W公司(W公司) 阅读 w个(w个,w个) : W公司W公司(*) w个(w个w个)\阵列{读取和\冒号和W状态(W)\\读取\\equiv&w\mapsto(w,w)}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\阵列{将&\冒号&W\写入W状态(\ast)\\写入&\equiv&w\mapsto(w'\mapstow)}

任何W公司W公司-有状态程序,例如简单示例

股份有限公司 : (*) 股份有限公司 n个n个+1\阵列{inc&\colon&\mathbb{N} 州(\ast)\\inc&\equiv&n\mapston+1}

可以用do-notation构造,例如:

对于类似的效果单体,例如列表单子类似的-递增数字列表中所有条目的代码如下所示:

这里是-右边的符号唤起了每个步骤一个数字n个:n\colon\mathbb{n}从MyList中“读出”,然后返回其增量-但从语言上看,它隐含了要执行此操作的想法对于所有元素并将所有结果重新编译到输出列表中。

事实上,一般来说,将克莱斯利作文视为“读出”数据是一种误导。Kleisli构图真正的目的是根据具有发电机并根据程序的功能定义程序发电机上,因此对于给定的生成数据:

因此,一元效应绑定操作在概念上更准确(如果可能不那么简洁)的程序语言反映是“对于“-块:

就这种for-do-notation而言,我们从上面开始的一般情况具有以下语法呈现:

这种语法可能不太简明扼要,但它相当接近于用单数效果编程时实际发生的事情。

例如,上面的计算给定列表中所有数字的操作读入对于-符号如下:

清楚地表明操作方式+1+1已应用对于每个数字n个n个建立在里面列表。

(注意:与对于-中用于循环的符号命令式编程,自功能上这些表示为递归.)

将效果绑定作为对于-表达在以下语境中变得更加明显下部结构的 键入上下文例如在线性类型理论其中,通过“读取”单数类型的想法<-“-符号变得更加可疑。

例如,考虑相对单子(这个例子)它发送向量空间那是他们的线性跨度:

:设置 兽医 W公司 W公司𝟙\阵列{\数学重叠{\mathrm{Q}\;\;\冒号\;\;}设置纵向箭头矢量(&\longrightarrow-Vect)\\W&\mapsto&\underset(下集){W}{\oplus}\mathbb{1}}

具有

绑定 :(W公司W公司) (W公司W公司) (w个|ψ w个) ( w个q个 W公司|w个 w个q个 w个|ψ w个)\阵列{\数学重叠{bind^{\mathrm{Q}}\;\;\冒号\;\;}(W至mathrm{Q} W公司') &\长向右箭头&(\mathrm{Q} W公司\至\mathrm{Q} W公司')\\\左(w个\地图\left\vert\psi_w\right\范围\右侧)&\地图&\左(\sum_w q_{}_w}\left\vert w\right\范围\,\mapsto\,\sum_wq{{}_w}\left\vert\psi_w\right\rangle\右侧)}

在这种情况下,传统-这种符号表明,给定一个向量,人们可以从中“读出”一个基本元素,这在概念上是没有意义的。

相反,真正发生的是定义线性映射G公司:W公司G\冒号\mathrm{Q} 周\to\mathscr{H}关于配备有线性基础 W公司W公司(字面意思是:一套免费的发电机)定义这个映射就足够了对于每个基本向量|w个\左\右\范围-这正是对于-符号\数学{Q}-monad表达:


示例

可定义单子

各种单子可定义的就标准而言定型操作(例如产品类型,函数类型等)。其中包括以下内容(参见。Moggi 1991,实验1.1):

状态单子和随机存取存储器

A类功能程序的输入类型 D类D类,输出类型 D类D’可变状态W公司W公司是一个功能(同构)第页,共页类型 D类×W公司D类×W公司D\倍W\右箭头D'倍W–也称为粉碎机(请参见那里).

在(笛卡尔积 \仪表盘 内部hom)-附加(咖喱)这相当于它的辅助,它是类型的函数D类[W公司,W公司×D类]D\向右长箭头[W,W\乘以D']。这里是操作[W公司,W公司×()][W,W\倍(-)]单子由上述附加词诱导,后一个函数自然被视为Kleisli类别这个单子。这个单子[W公司,W公司×()][W,W\倍(-)]被称为状态单体类型的可变状态W公司W公司:

可能是单子和受控故障

这个也许是单子是操作X(X)X(X)*X\mapsto X\coprod\ast坐标。这里的想法是,函数X(X)Y(Y)X\向右长箭头Y在其中Kleisli类别在原始类别中是形式的函数X(X)Y(Y)*X\long-rightarrowY\corprod\ast(X \右长箭头Y \共处理器\上一个)所以要么返回一个值Y(Y)Y(Y)或者返回单元类型/终端对象 *\上一次。这自然被解释为“没有返回值”,因此表示“计算失败”。

异常单子和异常处理

(…)异常单子(…)

接续单子和接续通行

这个延续单子在给定类型上行为依据X(X)[[X(X),],]X\mapsto[[X,S],S].

(…)

公理单元

编程语言可以“公理化”地提供其他monad,这意味着它们是数据结构键入作为monad,但其实际类型形成、绑定和返回操作是编程环境提供的特殊用途操作。

这包括:

在这种情况下:

工具书类

概述

这个扩展系统-计算机科学中使用的单子的样式表示在以下内容中有简要介绍:

并在中扩展

但与计算无关。

单子作为“计算概念”的最初观察结果是:

进一步讨论:

关于莫吉(1991):

原产地方位角对于克莱斯利成分有效程序的数量:

引入单极变压器:

更多(早期)文献如下:

一般来说相对单子:

双重概念计算机科学中的共鸣曲作为模型上下文:

关于辅音上下文的尾标法:

并强调将单子,共鸣曲分级模式:

识别(协同)效应处理(有限公司)模型在给定(co)单子上:

实际讨论程序设计语言例如哈斯克尔:

斯卡拉:

进一步讨论/阐述计算机科学中(co)单子的概念和应用:

另请参阅:

规范单子在里面哈斯克尔位于:

并对范畴理论哈斯克尔的单子

关于CS-型单子真正存在的问题强单子:

单子体与应用函子(也称为习语)和箭头(计算机科学)在中

在量子计算中

讨论量子计算就单子而言:

这个量子IO单子:

展览会:

在中的实现哈斯克尔:

上面条目中的大部分文本和图表如下

上次修订时间:2023年12月12日23:49:33。请参阅历史获取所有贡献的列表。