读编程与类型系统笔记06_函数类型的高级应用

C#高级编程技巧与应用实践 本文介绍了C#编程语言的一些高级编程技巧和应用实践,包括委托和事件、泛型、LINQ查询、异步编程和特性等。掌握这些技巧和实践,可以帮助我们提高编程效率,写出更高质量的代码。委托是一种用于封装方法的类型,可以将方法作为参数传递给其他方法。通过委托和事件,我们可以实现松耦合的设计,提高代码的可维护性和扩展性。本文将介绍C#编程语言的一些高级编程技巧和应用实践,帮助读者提高编程效率,写出更高质量的代码。除了使用.NET Framework提供的泛型集合外,我们还可以自定义泛型类和方法。 阅读详情

 

1. 装饰器模式

1.1. 扩展对象的行为,而不必修改对象的类

1.2. 装饰的对象可以执行其原始实现没有提供的功能

1.3. 优势

1.3.1. 支持单一职责原则

1.3.1.1. 每个类只应该承担一种职责

1.4. 经典实现

1.4.1. 一个IComponent接口

1.4.2. 一个具体实现,即ConcreteComponent

1.4.3. 使用额外行为来增强IComponent的Decorator

1.4.3.1. 例如:添加单例行为

1.4.4. 特点

1.4.4.1. 一个接口

1.4.4.1.1. 接口声明了多个方法,就无法使用一个函数类型来替代接口

1.4.4.2. 两个类

1.4.4.3. 每个类一个方法

1.4.4.3.1. 具体操作

1.4.4.3.2. 装饰器

1.5. 函数装饰器

1.5.1. 接口改为一个函数类型

1.5.1.1. 示例:该类型的函数不接受实参,返回一个Widget:() => Widget

1.5.2. 一个具体实现的类替换为简单函数

1.5.3. 一个新函数singletonDecorator()

1.5.3.1. 接受一个WidgetFactory类型的函数

1.5.3.2. 返回另外一个WidgetFactory类型的函数

1.5.3.3. 采用lambda实现

1.5.4. 特点

1.5.4.1. 一个函数类型

1.5.4.1.1. 工厂函数类型

1.5.4.2. 两个函数

1.5.4.2.1. 工厂函数

1.5.4.2.2. 装饰器函数

1.6. 闭包

1.6.1. lambda捕获

1.6.1.1. lambda内捕获的一个外部变量

1.6.2. 编程语言通过闭包来实现lambda捕获

1.6.3. 闭包记录了创建该函数时的环境

1.6.3.1. 可以在不同调用之间维护状态

1.6.4. lambda引用了函数的局部变量

1.6.4.1. 其生存期将大于创建它的函数

1.6.4.2. 函数的局部变量在调用函数时创建,在函数返回时销毁

1.6.5. 保留了其外层函数的一些状态信息的lambda

1.6.6. 只有存在高阶函数,闭包才有意义

1.6.6.1. 不能从一个函数中返回另一个函数,就不存在要捕获的环境

1.6.6.2. 所有函数都在全局作用域内,所以全局作用域就是它们的环境

1.6.6.2.1. 函数只能引用全局变量

1.6.7. 对象代表一组方法的某个状态

1.6.8. 闭包则代表捕获到某个状态的函数

2. 计数器

2.1. 全局计数器

2.1.1. 一个引用全局变量的简单函数

2.1.2. 缺点

2.1.2.1. 计数器的值没有被恰当封装

2.1.2.2. 不能使用计数器的两个独立的实例

2.2. 面向对象的计数器

2.2.1. 多个独立的计数器

2.3. 函数式计数器

2.3.1. 代码比面向对象版本的更加简洁

2.4. 可恢复的计数器

2.4.1. 可恢复的函数

2.4.1.1. 跟踪自己状态的函数,在被调用时,不会从头运行,而是从上一次返回时所在的状态恢复执行

2.4.2. 不使用关键字return来退出函数

2.4.3. 使用关键字yield

2.4.3.1. 必须把函数声明为一个生成器

2.4.3.2. 其返回类型必须是可迭代的迭代器

2.4.3.3. 在函数名称的前面加上星号来声明生成器

2.4.4. TypeScript语法

2.4.5. 生成器通过特殊语法来创建可恢复的函数

2.4.6. 生成器不是返回控制权,而是交出控制权

3. 异步

3.1. 按顺序运行代码可能导致不可接受的延迟

3.2. 回调

3.2.1. 作为实参提供给异步函数的一个函数

3.2.2. 也可以从异步函数那里收到实参

3.3. 异步执行模型

3.3.1. 线程

3.3.2. 事件循环

3.3.2.1. 使用一个队列

3.3.2.2. 异步函数将被加入队列

3.3.2.3. 它们自己也可以将其他函数排队

3.3.2.4. 只要队列不为空,队列中的第一个函数就将被取出来执行

3.3.2.5. 优点

3.3.2.5.1. I/O操作等待数据时让它们排队的效果很好

3.3.2.5.2. 不需要同步,因为所有代码在一个线程上运行

3.3.2.6. 缺点

3.3.2.6.1. 对于运行时间长,但是不能被拆分为多个操作的任务,效果不好

3.3.2.6.2. CPU密集的操作会造成阻塞

3.3.2.6.2.1. CPU密集的操作(如复杂计算)不能被排队

3.3.2.6.2.2. 需要CPU周期

3.3.2.6.2.3. 没有等待数据

3.4. 简化异步代码

3.4.1. promise

3.4.1.1. 将来某个时刻可用的值的一个代理

3.4.1.2. 在生成该值的代码运行之前,其他代码可以使用该promise设置在该值可用后如何处理该值,在发生错误时如何处理,甚至取消将来的执行

3.4.1.3. 让代码的可读性相比使用回调时更好

3.4.1.4. 状态

3.4.1.4.1. 等待(pending)

3.4.1.4.1.1. 已被创建,但还没有完成

3.4.1.4.2. 完成(settled)

3.4.1.4.2.1. 已经调用了,并提供了一个值,此时将调用continuation

3.4.1.4.3. 拒绝(rejected)

3.4.1.4.3.1. 调用reject()或者抛出错误

3.4.1.4.3.1.1. 当前的promise会被拒绝

3.4.1.4.3.1.2. 通过then()链接到该promise的其他所有promise都会被拒绝

3.4.1.5. 组合promise

3.4.1.5.1. Promise.all()

3.4.1.5.1.1. 一组promise作为实参

3.4.1.5.1.2. 返回当提供的所有promise都完成后完成的一个promise

3.4.1.5.2. Promise.race()

3.4.1.5.2.1. 一组promise作为实参

3.4.1.5.2.2. 返回当提供的任何一个promise完成时完成的一个promise

3.4.2. continuation

3.4.2.1. 在promise的结果可用后调用的函数

3.4.2.2. 并非必须返回一个promise

3.4.2.2.1. 不是总会链接异步函数

3.4.2.2.2. 可以同步执行

3.4.2.2.3. 自动转换为Promise

3.4.2.3. 每个continuation放到一个单独的函数中,并通过then()把它们链接起来

3.4.3. 函数promise提供给我们某个类型T的值,以及指定从T到其他某个类型U的函数((value: T)=> U)的能力,当承诺被履行,我们得到了值以后,将调用这个函数(它就是continuation)

3.4.4. JavaScript(及TypeScript)采用Promise类型实现

3.4.5. C#采用Task实现

3.4.6. JAVA采用CompletableFuture实现

3.4.7. async/await

3.4.7.1. 代码的可读性更好

3.4.7.1.1. 异步代码读起来类似于同步代码

3.4.7.2. 把所有代码写到一个函数中,每当调用另外一个返回promise的函数,就等待(await)其结果,然后在得到结果后继续执行

3.4.7.3. 异常将从await调用抛出,可在try/catch语句中捕获

3.4.7.4. 不使用then()提供continuation

3.4.7.5. 语法糖

编程语言:类型系统的本质 0. 引子我一直对编写更好的代码有浓厚的兴趣。如果你能真正理解什么是抽象,什么是具象,就能理解为什么现代编程语言中,接口和函数类型为什么那么普遍存在了。在使用函数式语言进行编程后,就能够很清晰地理解为什么随着时间的推移,更主流的语言开始采用函数式语言中的一些被认为理所当然的特性。我将多年间学习类型系统和编程语言开发的经验汇聚起来,加以提炼,并辅以现实世界的应用,撰写了这篇............ 阅读详情

相关推荐

75、深入理解Dart编程语言中的类型系统与函数类型

本文深入探讨了Dart编程语言的类型系统,包括静态类型、动态类型、函数类型、泛型及其子类型关系等内容。文章详细分析了不同类型的使用场景、潜在风险以及优化策略,并结合代码示例展示了如何在实际开发中合理利用这些特性提升代码质量与可维护性。

nut55的博客 51

读编程与类型系统笔记05_函数类型

8.2.2.4.2.1.1. 接受一个实参并返回一个boolean的函数。可以传递函数而不是传递实际的值,并在需要值的时候调用这些函数。接受一个或多个非函数实参并返回一个非函数类型的“标准”函数。将函数赋值给变量,并像处理类型系统中的其他值一样处理它们。状态和转移作为一个单独的枚举进行维护,有不同步的风险。该实参函数接受项目T作为实参,并返回U类型的一个值。函数的实参类型和返回类型决定了函数的类型。两个函数接受相同的实参,并返回相同的类型。定义:把所有接受或返回其他函数的函数。

lyingSeven的博客 154

类型系统在函数式逻辑编程中的应用

本文将探讨类型系统在函数式逻辑编程中的应用。首先,我们将介绍函数式编程和逻辑编程的基本概念,并解释类型系统的定义及其在编程语言中的重要性。接着,我们将深入探讨类型系统在逻辑编程中的特点和应用,包括逻辑类型的定义、模式匹配和类型约束。最后,我们将通过具体的函数式逻辑编程语言,如Haskell和Scala,展示类型系统在实际编程中的应用和优势。类型系统可以定义为一种机制,用于检查程序中的变量、表达式和函数等的类型是否一致,以及如何进行类型之间的转换和操作。类型。

AI天才研究院 365

深入探索Scala的高级类型系统:特性与应用

Scala的类型系统建立在强类型和类型推断的基础上,提供了丰富的类型抽象和操作能力。类型推断:Scala的编译器能够根据上下文自动推断变量和表达式的类型。泛型:允许创建类型参数化的类和函数,以支持类型安全的代码复用。类型参数化:允许定义接受类型参数的类和方法,增强代码的灵活性和重用性。协变与逆变:在泛型编程中,允许子类型化关系在参数化类型中传播。高阶类型:支持函数作为参数或返回值,增强了函数式编程的能力。路径依赖类型:提供了更精确的类型信息,增强了类型检查的严格性。复合类型。

2402_85761468的博客 852

71、JavaScript 高级特性与类型系统深度解析

本文深入解析了 JavaScript 的高级特性和类型系统,涵盖了函数类型、联合类型、枚举类型、可区分联合等核心概念,并结合异步编程、类与继承、模块化编程等应用场景,帮助开发者更高效地编写安全和结构清晰的代码。同时介绍了数组操作、正则表达式、客户端数据存储以及图形绘制等实用技术,全面提升 JavaScript 编程能力。

food6的博客 63

TypeScript高级技巧:枚举与函数类型的应用

本文深入探讨了TypeScript中枚举和函数类型的应用,揭示了抽象类、枚举、类型安全性的重要性。文中指出枚举在代码优化中的作用,以及如何通过类型注解提高JavaScript代码的质量。同时,介绍了编写现代JavaScript代码时的一些最佳实践,并强调了在开发中保持关注点分离的重要性。

weixin_36001279的博客 534

【TypeScript进阶:类型系统与高级特性详解及框架选型指南】

🔥TypeScript进阶终极指南:掌握类型系统与高级特性!深度解析条件类型、映射类型等18个高级特性,结合React/Vue3实战案例。包含框架选型决策树、生产级优化方案,解决类型收窄、泛型约束等10+进阶问题,附完整代码模板与性能监控方案!🚀

weixin_74887700的博客 1323

PHP类型系统高级特性实现与优化

本文还有配套的精品资源,点击获取 简介:PHP的类型系统对于代码的质量和稳定性至关重要。本文将探讨如何在用户空间中利用第三方库和编程技术实现高级类型特性,如泛型、类型列表、元组和结构,来提高PHP代码质量。讨论将包括使用 splat/php-typing 和 spatie-typed 等库来模拟泛型容器,表示类型列表,实现静态类型检查的元组,以及...

weixin_42575505的博客 1285

重新学习 TypeScript 类型系统

重新学习 TypeScript 类型系统

chengbo_eva的博客 906

【Verilog】valid-ready双向握手机制 ——很绕但是很有意思

valid-ready双向握手机制。

GalaxyerKw的博客 1万+

AI 辅助代码审查:开启代码质量管控的智能时代

AI辅助代码审查正在改变传统的代码质量管控方式。通过自动化分析、智能反馈和上下文感知,AI不仅提高了代码审查的效率,还提升了代码质量的一致性和可维护性。随着机器学习和深度学习技术的不断发展,未来AI将成为开发者日常工作中强大的助手,进一步推动软件开发向智能化、自动化方向发展。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 3225

编程与类型系统读后总结与感想

不论类型是否常见,讲其然,也讲其所以然。个人觉得比较重要的类型如下:空类型单元类型可选类型和类型Either类型变体类型。

lyingSeven的博客 137

第1课:开篇扫盲——OpenClaw是什么?能帮你解决什么问题?(入门必看)

核心目标:学会安装、卸载、管理OpenClaw技能,自定义AI代理的性格与权限,让AI贴合自己的使用习惯。核心内容技能市场详解:ClawHub市场核心技能分类(办公、学习、开发、生活),热门技能推荐(web-search、文件处理、邮件管理)[superscript:3][superscript:4]。技能安装与卸载:终端命令实操(openclaw skill install/uninstall),技能更新与版本管理[superscript:3]。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1754

读编程与类型系统笔记11_高级类型及其他

对于任何泛型类型,以Box为例,如果map()操作接受一个Box和一个从T到U的函数作为实参,并得到一个Box,那么该map()就是一个函子。TypeScript、C#或Java中没有一种好的方式来表达高阶类型,所以我们不能通过使用类型系统表达一个函子的方式来定义结构。范畴论是数学的一个分支,研究的是由对象及这些对象之间的箭头组成的结构。T或Box有一个类型参数T,后者又有一个类型参数U。在Box上应用函数T => Box,返回一个Box

lyingSeven的博客 196

【深度学习】最强算法之:残差网络(ResNet)

一篇掌握深度学习算法之:残差网络

商务合作 | 面试培训 | 职场规划 ==>主页扫码 7837

面向红外小目标检测的SCTransNet:模型优势解析、代码实现与完整复现指南

摘要:本文详细介绍了基于SCTransNet的红外小目标检测全流程实践方案。针对红外小目标检测面临的三大挑战(特征稀缺、背景干扰、尺度变化),SCTransNet通过空-通道交叉注意力机制有效增强目标特征。文章包含完整的PyTorch实现代码,涵盖特征提取、注意力模块、多尺度融合等核心组件,并提供模型训练、评估的具体方法。同时给出毕设创新方向的建议,如模型轻量化、多模态融合等,帮助提升研究深度。该方案技术难度适中,应用价值明确,是红外目标检测领域理想的毕设选题方向。

m0_71589036的博客 4759

浅谈编程语言的类型系统

一、思考源头 最近思考上终于突破了之前面向过程编程给自己设下的思维困惑,准确的将面向对象编程的最初基础找到了。编程语言的核心定位为:基本数据类型+计算逻辑+语言规则设计(例如面向对象语言中的集成和实例化规则)。今天终于找到了对该思维的学术定义——类型系统。 二、类型系统解释 类型系统(type system)是一门编程语言最核心也是最基础的部分。无论该语言基于何种编程范式,都必须在开天辟地之初首先...

xihuanyuye的博客 5081

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3442

【C++17 core language features】C++17 核心语言特性下将异常规范纳入类型系统的实践

在软件开发中,异常处理机制是确保程序健壮性和可靠性的重要手段。C++作为一门强大的编程语言,通过异常规范(Exception Specifications)来定义函数可能抛出的异常类型。然而,异常规范长期以来在C++中的应用并不广泛,直到C++17对其进行了显著的改进,将其更加紧密地纳入类型系统。正如古希腊哲学家赫拉克利特所言:“唯有变化是永恒的。” C++语言的发展亦是如此,通过不断演进来适应现代编程需求。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1385

微信小程序 - 详细实现可移动悬浮按钮,全屏悬浮元素图标可拖动拖拽并自动吸附边缘,微信小程序实现悬浮球吸附边缘+计算靠边靠拢效果(详细代码,拖拽中途放手,靠左就自动跑到屏幕左侧,反之靠右跑到屏幕右侧)

微信小程序,vue2,vue3,微信小程序悬浮功能小按钮,自动吸附边缘效果,微信小程序之可拖动悬浮按钮的实现,如何实现靠近边缘自动吸住功能,小程序右下角的悬浮效果,实现可拖动悬浮图标,自动向两边靠拢,悬浮按钮的实现,微信小程序悬浮球效果,微信小程序(可拖动悬浮按钮)当靠近屏幕边缘时会磁吸靠近,如何实现全局悬浮按钮,悬浮球判断吸附在左右,全屏悬浮能拖着走,小程序怎么做悬浮图标靠近左右两侧能吸附住,悬浮菜单按钮,悬浮球可拖拽,全局悬浮球,全局悬浮框,实现悬浮按钮可拖动,自动吸附边缘效果,若按钮此时位于页面中间偏

🏆 前端领域优质创作者 1万+

记录Android Studio连接华为(nova)手机鸿蒙系统踩过的坑

鸿蒙系统的华为老机子比较麻烦,坑有点多,兄弟们加油!

沉迷单车的追风少年 7920

ArrayFire高级编程技巧:模板元编程与类型系统深度解析

ArrayFire是一个强大的通用GPU计算库,它通过模板元编程和先进的类型系统提供了卓越的性能和灵活性。本文将深入解析ArrayFire的核心编程技巧,帮助开发者充分利用这个强大的工具。🚀 ## ArrayFire类型系统架构解析 ArrayFire的类型系统是其高性能计算的核心。通过`dtype_traits`模板特化,ArrayFire为每种数据类型提供了统一的接口。在`include

gitblog_00865的博客 833

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

仓颉编程语言函数类型与嵌套函数深度解析

仓颉语言的函数编程特性解析 本文系统介绍了仓颉语言中作为一等公民的函数类型及其应用。主要内容包括:1)函数类型的定义与特性,支持类型安全、泛型和组合;2)函数子类型系统的逆变协变规则;3)嵌套函数的定义规则、作用域和闭包机制;4)高阶函数与嵌套函数的结合应用;5)性能优化策略与典型应用场景。文章强调通过合理使用函数类型和嵌套函数,可以实现类型安全的高阶抽象、优雅的状态封装和逻辑组织,同时需要注意避免常见陷阱如意外捕获和内存泄漏。

Huang兄 1022

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TypeScript进阶教程,类型系统与高级特性详解

TypeScript的类型系统包括基本类型、复合类型、引用类型和函数类型等。TypeScript的基本类型包括:`number`、`string`、`boolean`、`void`、`null`、`undefined`、`symbol`和`bigint`。引用类型包括:`object`、`array`、`null`、`undefined`和`symbol`等。复合类型是由基本类型通过组合而成的,例如:`array`、`tuple`、`interface`和`class`等。

2509_93945468的博客 291

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL高级查询与编程笔记 • 【目录】

章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • 【第1章 数据库设计原理与实战】 第2章 MySQL高级查询与编程笔记 • 【第2章 数据定义和操作】 第3章 MySQL高级查询与编程笔记 • 【第3章 子查询】 第4章 MySQL高级查询与编程笔记 • 【第4章 MySQL编程】 第5章 MySQL高级查询与编程笔记 • 【第5章 常见数据库对象】 第6章 MySQL高级查询与编程笔记 • 【第6章 My...

杨明金的博客 1万+
上一篇: 读编程与类型系统笔记05_函数类型
下一篇: 读编程与类型系统笔记07_子类型
躺柒
博客等级 码龄4年 7004粉丝 1317原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值