[学习笔记] ADT, Comonad, GADT

作者&投稿:永翰 (若有异议请与网页底部的电邮联系)
~

代数数据类型:积与和的精妙表达


在Haskell的世界里,代数数据类型(ADT)如魔法般地构建出"和"与"积"的概念,比如IntAndString和IntOrString,它们在Java中通过类和接口呈现,而新引入的sealed接口则巧妙地防止了意外的扩展。在Go中,文件操作返回的元组,承载着可能的文件和错误信息,这可视作一种隐性的积类型。


ADT的世界里,Maybe和GoStyleResult等类型用加法和乘法表述,1和0在代数系统中扮演着幺元的角色。1(Unit)是单值的象征,0(Void)则代表无值。类型运算遵循着严格的交换律、结合律和分配律,构建出丰富的类型世界。


深入理解ADT实例:从数据结构到函数映射


想象一下,A类型可以表示一个带有两种状态的字符串,用FirstState/SecondState或Bool和String的形式来表述。函数类型,如同一个计算表,可以处理复杂的映射关系。例如,整数映射表Integer * Integer可以表示2^32个Bool的乘积,递归定义自然数和列表,加减乘除的函数定义则为这些结构提供运算基础。


ADT的特性延伸至求导,带洞的数据结构如二元组和三元组,赋予了不同的挖洞可能性。列表和树的挖洞定义,展示了惰性求值的优势。特别地,Zipper登场,它是一个带洞的数据结构,记录了洞的位置信息,为纯函数式操作提供了便利,如列表和树的Zipper,支持修改和移动操作,而这一切都源于Comonad的概念。



  • ListZipper的实现:它能根据给定的元素和函数,生成连续应用的序列,实现诸如替换和移动等操作的高效执行。


Comonad的核心在于Functor,unwrap和duplicate操作,前者解包一层数据,后者嵌套Zipper,为处理依赖上下文的迭代任务,如卷积和康威生命游戏,提供了强有力的工具。


Comonad的实例与应用


unwrap和cobind操作结合,定义了Comonad的绑定和返回核心功能。通过它们,我们可以看到Comonad在实际场景中的力量,如在处理递归或上下文相关的任务时,如卷积和生命游戏的模拟。


GADT:细化ADT的利器


GADT(Generalized Algebraic Data Types)在此基础上更进一步,细化ADT的类型,如List和Expression树。GADT的应用确保了类型安全性,例如在表达式树的定义中,IntAdd只处理整数类型,避免了潜在的类型错误。




  • GADT实例展示: List类型细化为List t = EmptyList | ListNode t (List t),例如List Integer或List Bool。

  • Expression数据类型细化为如下的操作:IntConstValue (Integer), BoolConstValue (Boolean), IntAdd (Integer, Integer), IntNegate (Integer), BoolAnd (Boolean, Boolean), 和 BoolNegate (Boolean)。



在Java中,我们看到这样的实现:



  • 定义Expression接口

  • 具体类型如IntConstValue, BoolConstValue, IntAdd等




兰州市15029793953: 10篇短的读书笔记 -
迪娴曲匹: 这个假期,我读了美国作家海明威的《老人与海》. 故事的主人公桑地亚哥是个硬汉子.在连续八十四天没有打到一条鱼后,他终于发现了一条巨大的大马林鱼.老人费尽心力把鱼扎死.然而,一群嗅着血腥味而来的大鲨鱼扑了过来.最后,老...

兰州市15029793953: word 2010新建一个名为学习笔记的文档 -
迪娴曲匹: 一、桌面右键,新建,选择Word文档 二、重命名,学习笔记 三、打开输入内容

兰州市15029793953: 英语读书笔记 牙齿和爪子 -
迪娴曲匹: 《牙齿和爪子》这本书是有几个短小精悍的故事:《斯莱德尼.瓦什塔》、《讲故事的人》、《加布里埃尔.欧内斯特》、《托博莫里》、《母狼》组成的.每一则故事的篇幅都不长,但却是篇篇精彩. 本书作者赫克拉·休·芒罗是一名记者,也...

兰州市15029793953: 读书笔记范文
迪娴曲匹: 《爱的教育》读书笔记 爱的教育》这本书是一部流传世界各地的著作,它是以一个小孩的日记方式来写的,虽然每篇的篇幅不长,但都有一个感人的故事.“爱”,一个多么闪亮,多么令人钟爱的字眼.人们追求爱,也希望能拥有爱,爱能使人...

兰州市15029793953: 《钢铁是怎样炼成的》读书笔记每篇200~300字(共2篇) -
迪娴曲匹: 《钢铁是怎样炼成的》读书笔记 《钢铁是怎样炼成的》这部小说我在假期中已经看了好几遍了,它是我最喜欢的课外读物之一,其中有关人生意义的段落,我还能把它给背诵出来呢! 人应该怎样地活着才有意义呢?保尔·柯察金用行动回答了...

兰州市15029793953: 关于学习笔记 -
迪娴曲匹: 如何写语文笔记 俗话说,“心记不如带墨”,“眼过千遍不如手写一遍”.老师在课堂上把课讲得再清楚,如果学生不记下来,过些时候也会忘的.记笔记是记忆的扩大和延伸,便于以后复习、查找.越是高等的学习,越是以记为主.学生在课...

兰州市15029793953: 各科学习笔记怎么写
迪娴曲匹: 把你认为有价值的记下来,平常拿出来翻看翻看, 语文笔记最好再记些词语中容易读错的字的读音和容易错的字 另外在把数学,物理,化学等你认为学的不好的科目弄个错题本,很有帮助哦

兰州市15029793953: 学霸笔记和黄冈随堂笔记哪个好 -
迪娴曲匹: 答案:黄冈随堂笔记和学霸笔记是不同的笔记,虽然都是学生们用来记录学习笔记的工具,但在使用方法和内容方面有所不同.解释:黄冈随堂笔记是指黄冈中学的一种学习方法,主要是指在上课时,学生通过记录老师讲解的知识点,以及自己...

兰州市15029793953: 何为读书笔记?该怎么写?读书笔记和批注的区别是什么啊?读书笔记该怎么写啊? -
迪娴曲匹:[答案] 读书笔记主要分为作者介绍,内容介绍好句介绍,好段介绍和我的感想,而批注则是批注就是阅读时在文中空白处对把文章进行批评和注解,作用是帮助自己掌握书中的内容.

兰州市15029793953: 什么是读书笔记,该怎样写? -
迪娴曲匹:[答案] 读书笔记指读书时为了把自己的读书心得记录下来或为了把文中的精彩部分整理出来而做的笔记.在读书时,写读书笔记是训练阅读的好方法.记忆,对于积累知识是重要的,但是不能迷信记忆.列宁具有惊人的记忆力,他却勤动笔,写下了大量的读书...

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网