首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编程(28)-粗俗浅解:Functor, Applicative, Monad

经过了一段时间的泛编程讨论,始终没能实实在在的明确到底泛编程有什么区别和特点;我是指在现实编程的情况下所谓的泛编程到底如何特别。...我们就以一步步更改程序状态的方式,一行一行的拼凑指令:这就是典型的行令式编程了。 泛编程,顾名思义,就是用一个个函数来编程。讲的再深入点就是通过函数组合来更改程序状态。什么意思?为什么?...严格来讲,在泛编程中是没有在某个地方申明一个变量,然后在一些函数里更新这个变量这种方式的。与申明变量相对应的是泛编程会把所谓变量嵌入在一个结构里,如:F[A]。F是某种高阶类型,A就是那个变量。...如果我们需要去更改这个变量A就必须设计一套专门的函数来做这件事了。从某些方面这也解释了何谓泛编程。我用粗俗的语言来描述这两种编程模式的区别:行令编程就像在床面上打扑克,而泛编程就好比在被窝里打牌。...实际上泛编程的这种在套子内部更新变量方式恰恰是我们选择泛模式的考虑重点:它可以使程序运行更安全稳定、能轻松解决很多行令编程模式中存在的难题,这些优点将会在将来的应用中逐渐显现出来。

1K60
您找到你想要的搜索结果了吗?
是的
没有找到

Py自动化办公—Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送实战案例

背景 想象一下,现在你有一份Word邀请模板,然后你有一份客户列表,上面有客户的姓名、联系方式、邮箱等基本信息,然后你的老板现在需要替换邀请模板中的姓名,然后将Word邀请模板生成Pdf格式,之后编辑统一的邀请话术...不过别慌,Python自动化办公,一套组合拳,使用Python自动化办公——Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送一条龙服务安排,下面一起来看看吧!...实现过程 1)替换Word模板生成对应邀请 这里以上面的Word模板做案例,编写一个函数以客户姓名进行替换模板中的,一步到位。.../邀请/{name}.docx") 使用convert()函数可以把docx格式的文件转换成同名的Pdf文档。...: get_username_email() # get_invitation('Python进阶者') 总结 这篇文章基于Python自动化办公,主要介绍了使用Python相关库,依次完成

1.9K41

编程语言:类型系统的本质

类型系统 类型系统是一组规则,为编程语言的元素分配和实施类型。这些元素可以是变量、函数和其他高级结构。...类型系统通过两种方式分配类型:程序员在代码中指定类型,或者类型系统根据上下文,隐式推断出某个元素的类型。类型系统允许在类型之间进行某些转换,而阻止其他类型的转换。...类型系统是一组规则,为编程语言的元素分配并实施类型。 类型限制了变量的取值范围,所以在一些情况中,运行时错误就被转换成了编译时错误。...“一等函数”编程语言,可以把函数赋值给变量、作为实参传递以及像使用其他值一样使用,这使得代码的表现力更强。 一个简单的策略模式 策略设计模式 策略模式是最常用的设计模式之一。...函数组合是一种把多个函数组合成新函数的方式,它解决了函数嵌套调用的问题,还提供了函数拆分组合的方式。 函数的子 除了子外,需要知道的是,还有函数的子。

2.6K31

深入理解JavaScript函数式编程

❝函数式编程的思维方式是把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)....(还有面向过程编程、面向对象编程) 面向对象编程的思维方式: 把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系 函数式编程的思维方式是把现实世界的事物和事物之间的联系抽象到程序世界...(y){ return x + y; } } let a = test(1)(2);//3 高阶函数的意义 抽象帮助我们屏蔽细节,只需要关注我们的目标 高阶函数是用来抽象通用的问题 面向过程方式与函数式编程方式对比...Pointed 子是实现了of静态方法的子,of方法是为了避免使用new来创建对象,更深层的含义是of方法用来把值放到上下文Context(把值放到容器中,使用map来处理值) 其实上述将的子都是...,因为大量使用闭包在某种程度上会降低性能 函数式编程中的函数不是程序中的函数和方法,而是数学中的函数 函数式一等公民(MDN的解释中只包含这三点) 函数可以存储在变量中 函数可以作为参数 函数可以作为返回值

4.2K30

编程(34)-泛变量:处理状态转变-ST Monad

编程的核心模式就是函数组合(compositionality)。实现函数组合的必要条件之一就是参与组合的各方程序都必须是纯代码的(pure code)。...所以在泛编程模式中好像是禁止任何状态变化的(state mutation)。...但实际上泛编程并没有任何明文禁止一个函数内部使用状态转变,所以:如果一个函数f(x)的输入参数x是RT等量可替换的,那么函数f还是个纯函数(pure function)。  ...但是,使用了局部变量后往往迫使代码变得很臃肿。程序变得复杂影响了代码的理解、维护及重复利用。 泛编程采用的是一种处理变量状态变化的编程语言。...我们需要实现的方法包括: 分配新的内存单元(memory cell) 读取内存单元数据 存写内存单元数据 ST是个Monad,我们可以制造一个for-comprehension的Monadic语言来进行泛变量状态转变

65960

C++11 lambda

Introduction C ++ 11引入了lambda,该lambda提供了一种语法上轻量级的方式来动态定义函数。它们还可以通过值或引用来捕获(或封闭)周围范围的变量。...functor几乎相同:它们都分配存储捕获值的对象,并获取指向该对象的隐藏函数参数。...结论 C ++ lambda和子比相似之处更多。这是预料之中的;lambda的主要目标是成为创建函数和闭包的语法上简单的方法。即使没有捕获任何变量,它们也与普通函数略有不同。...这时,函数就需要记住上一次的执行状态数据以备下一次函数执行使用。 函数对象的出现就是用来弥补函数的这个缺陷的。利用函数对象自身的成员变量,函数可以记住在每次执行过程中的状态数据,找回失去的记忆。...这种方式使得我们不在需要设计通过继承与虚函数来实现多态,无疑为程序库设计提供的新的方式

1.1K30

编程(1)-泛编程是如何实现的

编程就是把函数组合起来形成一个完整的程序。可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的。那么泛编程又是如何保证一个复杂的函数组合程序是正确无误的呢?...我们可以通过”等量替换“方式来分析理解函数行为。纯函数(Pure Function)只依赖输入产生结果,不会造成任何”附带影响“(Side Effect)。...从以上的例子中我们还可以得出结论:泛程序能用正常的逻辑来理解,它的作用是可预测的,不容易出现粗心错误,可以放心使用。...泛编程要求尽量使用”不可改变的“(Immutable)数据结构来保证程序的纯洁性。泛编程就好像是使用”不可改变的“数据结构过程的挣扎,起码对我来说是这样的。...不经过中间变量直接返回结果;这就是泛编程的一个风格特征。

1.6K80

编程(5)-数据结构(Functional Data Structures)

如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量再对变量进行读写这个过程了。试想想如果没有数据结构,那我们要申明多少个变量呢。...所以说,数据结构是任何编程不可缺少的元素。     泛编程使用泛函数据结构(Functional Data Structure)来支持泛程序。...泛函数据结构的特点是”不可变特性“(Immutability), 是泛编程中函数组合(composition)的必需。...所以,与其它编程范畴不同,泛编程的泛函数据结构必须具体一套特定的数据运算方式。 泛函数据结构及运算方法具备以下特征: 1、不可变特性(Immutable) 2、运算在数据结构内进行。...4 sum: Int = 6 泛运算直接在数据结构内进行,不需要中间变量

67160

深度学习中常用激活函数的详细总结

a Sigmoid 激 活 数 ? ▲Sigmoid激活函数表达式 ? ▲Sigmoid导数表达式 ? ▲Sigmoid编程实现 ?...因而使用Sigmoid激活函数容易出现梯度弥散的现象,无法完成深层网路的训练; 在Tensorflow2.X中Sigmoid激活函数只有函数式接口的实现方式: 函数式接口:tf.nn.sigmoid(x...▲Sigmoid激活函数实现 b ReLU 激 活 数 ? ▲ReLU激活函数表达式 ? ▲ReLU导数表达式 ? ▲ReLU编程实现 ?...▲ReLU激活函数以及导函数图像 2012年ImageNet竞赛的冠军模型是由Hinton和他的学生Alex设计的AlexNet,其中使用了一个新的激活函数ReLU(REctified Linear Unit...▲ReLU激活函数类 c LeakyReLU 激 活 数 ? ▲LeakyReLU激活函数表达式 ? ▲LeakyReLU导数表达式 ? ▲LeakyReLU函数以及导函数实现 ?

1.8K20

【STM32F429】第7章 RTX5任务管理

图7.1 单任务系统 对于前后台系统的编程思路主要有以下两种方式: 7.2.1 查询方式 对于一些简单的应用,处理器可以查询数据或者消息是否就绪,就绪后进行处理,然后再等待,如此循环下去。...定义的堆栈使用 - 每个任务分配一个堆栈空间,从而实现可预测的内存使用。 系统管理 - 可以专注于应用程序开发而不是资源管理。...7.5 RTX5任务栈设置 不管是裸机编程还是RTOS编程,栈的分配大小都非常重要。...如果觉得每个任务都分配同样大小的栈空间不方便的话,可以采用自定义任务栈的方式创建任务。采用自定义方式更灵活些。...3:采用静态方式创建任务,即定义一个全局变量数组,注意任务栈要8字节对齐,可以将任务栈数组定义成uint64_t类型即可,这样就可以保证任务栈是8字节对齐的: http://www.armbbs.cn/

55520

【STM32H7】第7章 RTX5任务管理

图7.1 单任务系统 对于前后台系统的编程思路主要有以下两种方式: 7.2.1 查询方式 对于一些简单的应用,处理器可以查询数据或者消息是否就绪,就绪后进行处理,然后再等待,如此循环下去。...定义的堆栈使用 - 每个任务分配一个堆栈空间,从而实现可预测的内存使用。 系统管理 - 可以专注于应用程序开发而不是资源管理。...7.5 RTX5任务栈设置 不管是裸机编程还是RTOS编程,栈的分配大小都非常重要。...如果觉得每个任务都分配同样大小的栈空间不方便的话,可以采用自定义任务栈的方式创建任务。采用自定义方式更灵活些。...3:采用静态方式创建任务,即定义一个全局变量数组,注意任务栈要8字节对齐,可以将任务栈数组定义成uint64_t类型即可,这样就可以保证任务栈是8字节对齐的: http://www.armbbs.cn/

65130
领券