草庐IT

读编程与类型系统笔记09_泛型数据结构

躺柒 2023-03-28 原文

1. 恒等函数

1.1. 在代数中,恒等函数指的是函数f(x) = x

1.2. 恒等逻辑与getNumbers()和assembleWidgets()的问题域解耦,因为恒等逻辑和问题域是正交的,或者说是独立的

2. 类型参数

2.1. 将不同函数的区别,即它们的实参类型参数化

2.2. 一个泛型名称的标识符,用作客户端在创建泛型实例时指定的具体类型的占位符

3. 可选类型

3.1. 包含某个类型T的值,或者不包含任何内容

3.2. Optional实现

3.3. 当处理没有赋值的情况时,使用的逻辑与该值的实际类型并没有关系

4. 泛型函数 泛型类

4.1. 泛型函数(value:T) => T,它的类型参数是T

4.2. 当为T指定了实际类型时,就创建了具体函数

5. 泛型类型

5.1. 参数化一个或多个类型的泛型函数、类、接口等

5.2. 允许我们编写能够使用不同类型的通用代码,从而实现高度的代码重用

5.2.1. 让代码的组件化程度更高

5.2.2. 创建独立的、可重用的组件

5.2.3. 使用泛型来避免复制代码

5.2.3.1. 复制从来不是一个好的选择

5.3. Optional类型

5.3.1. 一个简单但是强大的泛型类型

6. 数据结构

6.1. 数据自身

6.2. 数据的形状

6.2.1. 二叉树中,以分层的方式布局数据,每个元素最多有两个子元素

6.2.2. 在链表中,数据是顺序布局的,一个元素在前一个元素的后面

6.3. 一组保留形状的操作

6.3.1. 用来添加或移除元素

6.4. 数据结构把形状赋予数据,而并不需要知道这些数据是什么, 使这些结构成为泛型,就允许为各种值重用形状,从而大大减少需要编写的代码量

6.5. 两个关注点

6.5.1. 数据

6.5.1.1. 数据的类型

6.5.1.2. 数据结构的实例保存的实际值

6.5.2. 数据的形状和保留形状的操作

6.5.3. 解耦关注点

7. 泛型数据结构

7.1. 如果能够从库中选择泛型数据结构,就应该使用库中的泛型数据结构

7.2. 处理数据的布局、形状和任何保留形状的操作

7.3. 数据布局的职责交给独立于任何实际数据内容的泛型数据结构

7.4. 与数据是什么没有关系

7.5. 不能解决全部问题

7.5.1. 仍然需要遍历它们

7.6. 对于分离独立的关注点很有用

8. 迭代器

8.1. 能够用来遍历数据结构的一个对象

8.1.1. 遍历策略和数据结构之间并不需要是一一对应的关系

8.1.2. 提供了一个标准接口,将数据结构的实际形状对客户端隐藏起来

8.1.2.1. 为遍历数据结构提供了公共接口

8.2. 把数据结构和算法连接起来的“胶水”

8.3. 迭代器模式十分有用,所以得到了原生支持

8.3.1. Java中的等效接口也叫作Iterator

8.3.2. 在C#中,等效的接口是IEnumerator

8.4. 在定义数据结构时,应该确保它实现了Iterable

8.5. Iterator代表一个迭代器

8.6. Iterable代表可迭代的东西

8.7. 使用生成器可实现迭代器

8.8. 并非必须是有限的,它们可以无限产生值

9. 生成器

9.1. 是一个可恢复的函数,使用yield语句返回控制权,并且当再次被调用时,会从上一次离开的状态恢复执行

9.2. 生成器返回一个IterableIterator,所以我们可以直接在for...of循环中使用它们,或者用它们来实现一个数据结构的Iterable接口

9.2.1. 大部分主流编程语言都有一个等效的特殊类型,用来支持一个能够遍历元素的for循环

9.3. 在实现遍历逻辑时,考虑使用yield

9.3.1. 它通常可以让代码变得更加整洁

9.3.2. Java中没有内置的yield语句

9.3.3. C#支持yield语句

10. 数据流

10.1. 无限数据流的例子

10.1.1. 从键盘读取字符

10.1.2. 从网络连接获取数据

10.1.3. 收集传感器数据

10.2. 把函数链接成处理管道,在可能无限的数据流上运行它们

11. 处理管道

11.1. 通过使用接受和返回迭代器的函数,能够构建处理管道

11.1.1. 一些函数,它们接受一个迭代器作为实参,进行一些处理,然后返回一个迭代器

11.1.2. 这种函数可以链接起来,在收到数据时处理数据

11.2. 反应式编程的基础

11.3. 迭代器是关键,因为它们使我们能够逐个处理值

11.4. 是延迟计算的

有关读编程与类型系统笔记09_泛型数据结构的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  3. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

随机推荐