关于函数式编程(Functional Programming)的学习笔记Ⅰ

C++函数式编程(Functional Programming, FP) ​。 阅读详情

关于函数式编程(Functional Programming)的学习笔记Ⅰ

原文链接:http://www.cnblogs.com/TivonStone/archive/2010/10/08/1845569.html

0.要点
1.背景知识
2.函数式编程(FP)
3.FP的特性


1.背景知识


  在C# 3.0中加入的新特性中,最大头的一个就是Lambda表达式,微软利用这个Lambda表达式结合其它一些特性演绎了很多东西,Lambda表达式和扩展方法一起带来了Linq to Objects,从Lambda表达式推演出来的表达式树又是Linq to SQL等的基础。而另一门语言F#也在悄悄崛起,Lambda表达式和F#都归属于函数编程范畴。

  我们肯定都知道冯.诺依曼,因为他是计算机之父,因为他的冯.诺依曼体系结构。我们肯定都知道阿兰.图灵,人工智能之父,著名的图灵奖堪称计算机业的诺贝尔。在这个时代还存在另外一个传奇人物:阿隆左·丘奇(Alonzo Church),知道这个人的请举手,反正我是很晚才知道。1936年,图灵的一篇论文:论数字计算在决断难题中的应用,在这篇论文中,提出了图灵机的设想,这也是今天计算机的基础,因为他不仅仅提出了设想,还在理论上证明了这种机器是可以制造出来的,不过在这之前,还有一个Lambda演算的理论,该理论奠定后来的Lisp语言(值得注意的是,Lisp是我们拥有的第二个计算机高级语言,仅次于Forton之后)和函数编程的基础。


2.什么是函数式编程(Functional Programming)

  函数式编程利用数学上的函数来避免状态(这个可是图灵机的基础,图灵机利用状态去判定下一步工作,而函数式编程却不需要状态)和可变的数据(今天,如果没有变量,我真的不知道我该怎么编写代码)。看起来非常的奇妙,但这一切都是Lambda演算赐予的。

      Wiki百科的定义是:是种编程范型,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。和命令式编程相比,函数式编程强调函数的计算比指令的运行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。

     函数是函数式编程的基本单位,函数几乎被用于一切,包括最简单的计算,甚至变量都由计算取代。在函数式编程中,变量只是表达式的别名(这样我们就不必把所有东西打在一行里)。变量是不能更改的,所有变量只能被 赋值一次。用 Java 的术语来说,这意味着所有单一变量都被声明为 final(或 C++ 的 const)。在函数式编程中没有非 final 的变量。



final int i = 5;
final int j = i + 3;

 

  因为函数式编程中所有变量都是 final 的,所以可以提出这样两个有趣的表述:没有必要总是写出关键字 final,没有必要把变量再称为变量。那么现在我们对Java作出两个修改:在我们的函数式 Java 中所有变量默认都是 final的,我们将变量(variable)称为符号(symbol)。

      就此你也许会质疑,用我们新创造的语言还能写出有些复杂度的程序吗?如果每个符号都是不可变更(non-mutalbe)的,那么就无法改变任何状态!其实事实并非完全如此。在阿隆左研究其 lambda 演算时,他并不想将某个状态维护一段时间以期未来对其进行修改。他关注的是对数据的操作(也通常被称为”演算体 caculating stuff”)。既然已被证明lambda演算与图灵机等价,它可以完成所有命令式编程语言能够完成的任务。那么,我们怎么才能做到呢?

     答案是函数式程序能保存状态,只是它并非通过变量而是使用函数来保存状态。状态保存在函数的参数中,保存在堆栈上。如果你要保存某个状态一段时间并时不时地对其进行一些修改,可以写个递归函数。举个例子,我们写个函数来翻转 Java 的字符串。记住,我们声明的每个变量默认都是 final 的。


String reverse(String arg) {
    if(arg.length == 0) {
        return arg;
    }
    else {
    return reverse(arg.substring(1, arg.length)) + arg.substring(0,1);
    }
}

3.函数式编程的特性

  • 闭包和高阶函数

       函数本身是first class对象,闭包是起函数作用并可以像对象一样操作的。 
       高阶函数是可以接受一个函数为参数,并可以返回一个函数。 

  • 延迟计算(lazy evaluation)
  • 递归的计算机制
  • 引用透明:      同样的输入返回同样的结果,与上下文无关。   
  • 没有副作用:      赋值后不能更改,既成为final


单元测试

因为函数式编程的每一个符号都是 final 的,没有函数产生过副作用。因为从未在某个地方修改过值,也没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)。这意味着函数求值的结果只是其返回值,而惟一影响其返回值的就是函数的参数。

     这是单元测试的理想环境。对被测试程序中的每个函数,你只需在意其参数,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。如果程序中的每个函数都通过了单元测试,你就对这个软件的质量有了相当的自信。而命令式编程就不能这样乐观了,在 Java 或 C++ 中只检查函数的返回值还不够——我们还必须验证这个函数可能修改了的外部状态。


调试

因为函数式编程的每一个符号都是 final 的,没有函数产生过副作用。因为从未在某个地方修改过值,也没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)。这意味着函数求值的结果只是其返回值,而惟一影响其返回值的就是函数的参数。

     这是单元测试的理想环境。对被测试程序中的每个函数,你只需在意其参数,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。如果程序中的每个函数都通过了单元测试,你就对这个软件的质量有了相当的自信。而命令式编程就不能这样乐观了,在 Java 或 C++ 中只检查函数的返回值还不够——我们还必须验证这个函数可能修改了的外部状态。


并行

  函数式程序无需任何修改即可并行执行。不用担心死锁和临界区,因为你从未用锁!函数式程序里没有任何数据被同一线程修改两次,更不用说两个不同的线程了。这意味着可以不假思索地简单增加线程而不会引发折磨着并行应用程序的传统问题。

      事实既然如此,为什么并不是所有人都在需要高度并行作业的应用中采用函数式程序?嗯,他们正在这样做。爱立信公司设计了一种叫作 Erlang 的函数式语言并将它使用在需要极高抗错性和可扩展性的电信交换机上。还有很多人也发现了 Erlang 的优势并开始使用它。我们谈论的是电信通信控制系统,这与设计华尔街的典型系统相比对可靠性和可升级性要求高了得多。实际上,Erlang 系统并不可靠和易扩展,Java 才是。Erlang 系统只是坚如磐石。

      关于并行的故事还没有就此停止,即使你的程序本身就是单线程的,那么函数式程序的编译器仍然可以优化它使其运行于多个CPU上。请看下面这段代码:

String s1 = somewhatLongOperation1();
String s2 = somewhatLongOperation2();
String s3 = concatenate(s1, s2);

  在函数编程语言中,编译器会分析代码,辨认出潜在耗时的创建字符串s1和s2的函数,然后并行地运行它们。这在命令式语言中是不可能的,因为在那 里,每个函数都有可能修改了函数作用域以外的状态并且其后续的函数又会依赖这些修改。在函数式语言里,自动分析函数并找出适合并行执行的候选函数简单的像 自动进行的函数内联化!在这个意义上,函数式风格的程序是“不会过时的技术(future proof)”(即使不喜欢用行业术语,但这回要破例一次)。硬件厂商已经无法让CPU运行得更快了,于是他们增加了处理器核心的速度并因并行而获得了四 倍的速度提升。当然他们也顺便忘记提及我们的多花的钱只是用在了解决平行问题的软件上了。一小部分的命令式软件和 100% 的函数式软件都可以直接并行运行于这些机器上。 


代码热部署

  1. 过去要在 Windows上安装更新,重启计算机是难免的,而且还不只一次,即使是安装了一个新版的媒体播放器。Windows XP 大大改进了这一状态,但仍不理想(我今天工作时运行了Windows Update,现在一个烦人的图标总是显示在托盘里除非我重启一次机器)。Unix系统一直以来以更好的模式运行,安装更新时只需停止系统相关的组件,而 不是整个操作系统。即使如此,对一个大规模的服务器应用这还是不能令人满意的。电信系统必须100%的时间运行,因为如果在系统更新时紧急拨号失效,就可 能造成生命的损失。华尔街的公司也没有理由必须在周末停止服务以安装更新。

           理想的情况是完全不停止系统任何组件来更新相关的代码。在命令式的世界里这是不可能的。考虑运行时上载一个Java类并重载一个新的定义,那么所有 这个类的实例都将不可用,因为它们被保存的状态丢失了。我们可以着手写些繁琐的版本控制代码来解决这个问题,然后将这个类的所有实例序列化,再销毁这些实例,继而用这个类新的定义来重新创建这些实例,然后载入先前被序列化的数据并希望载入代码可以恰当地将这些数据移植到新的实例。在此之上,每次更新都要重新手动编写这些用来移植的代码,而且要相当谨慎地防止破坏对象间的相互关系。理论简单,但实践可不容易。

           对函数式的程序,所有的状态即传递给函数的参数都被保存在了堆栈上,这使的热部署轻而易举!实际上,所有我们需要做的就是对工作中的代码和新版本的 代码做一个差异比较,然后部署新代码。其他的工作将由一个语言工具自动完成!如果你认为这是个科幻故事,请再思考一下。多年来 Erlang工程师一直更新着他们的运转着的系统,而无需中断它。


机器辅助的推理和优化

函数式语言的一个有趣的属性就是他们可以用数学方式推理。因为一种函数式语言只是一个形式系统的实现,所有在纸上完成的运算都可以应用于用这种语言 书写的程序。编译器可以用数学理论将转换一段代码转换为等价的但却更高效的代码。多年来关系数据库一直在进行着这类优化。没有理由不能把这一技术应 用到常规软件上。

       另外,还能使用这些技术来证明部分程序的正确,甚至可能创建工具来分析代码并为单元测试自动生成边界用例!对稳固的系统这种功能没有价值,但如果你 要设计心房脉冲产生器 (pace maker)或空中交通控制系统,这种工具就不可或缺。如果你编写的应用程序不是产业的核心任务,这类工具也是你强于竞争对手的杀手锏。


高阶函数

函数式语言提供了不同的抽象工具它会使你忘记你曾经习惯于修改变量。高阶函数就是这样一种工具。

     创建函数的方式和 C 中相似:


 
 int add(int i, int j) 
            {return i + j;}

  现在扩展我们的 Java 编译器使其支持这种记法。当我们输入上述代码后编译器会把它转换成下面的Java代码(别忘了,所有东西都是 final 的):

class add_function_t {
          int add(int i, int j) {
                return i + j;
          }
      }
 
      add_function_t add = new add_function_t();


这里的符号 add 并不是一个函数。这是一个有一个成员函数的很小的类。我们现在可以把 add 作为函数参数放入我们的代码中。还可以把它赋给另一个符号。

     我们在运行时创建的 add_function_t 的实例如果不再被使用就将会被垃圾回收掉。这些使得函数成为第一级的对象无异于整数或字符串。(作为参数)操作函数的函数被称为高阶函数。别让这个术语吓 着你,这和 Java 的 class 操作其它 class(把它们作为参数)没有什么区别。我们本可以把它们称为“高阶类”但没有人注意到这个,因为 Java 背后没有一个强大的学术社区。

      如果你发现在那个函数里一些逻辑动作根据情况有变,就把他提取成高阶函数。高阶函数只是开始!



惰性求值

惰性(或延迟)求值这一技术可能会变得非常有趣一旦我们采纳了函数式哲学。在讨论并行时已经见过下面的代码片断:

String s1 = somewhatLongOperation1();
String s2 = somewhatLongOperation2();
String s3 = concatenate(s1, s2);

在一个命令式语言中求值顺序是确定的,因为每个函数都有可能会变更或依赖于外部状态,所以就必须有序的执行这些函数:首先是somewhatLongOperation1,然后 somewhatLongOperation2,最后 concatenate,在函数式语言里就不尽然了。

       前面提到只要确保没有函数修改或依赖于全局变量,somewhatLongOperation1 和 somewhatLongOperation2 可以被并行执行。但是如果我们不想同时运行这两个函数,还有必要保证有序的执行他们呢?答案是不。我们只在其他函数依赖于s1和s2时才需要执行这两个函 数。我们甚至在concatenate调用之前都不必执行他们——可以把他们的求值延迟到concatenate函数内实际用到他们的位置。如果用一个带 有条件分支的函数替换concatenate并且只用了两个参数中的一个,另一个参数就永远没有必要被求值。在 Haskell 语言中,不确保一切都(完全)按顺序执行,因为 Haskell 只在必要时才会对其求值。

       惰性求值优点众多,但缺点也不少。我不在这里列出,有兴趣的朋友可以在这里看。



原文链接:http://www.cnblogs.com/TivonStone/archive/2010/10/08/1845569.html


函数式编程的基石 —— Lambda Calculus(Functional Programming) 在lambda演算中,函数是一等公民。可以把函数作为参数传入或返回,把函数赋值给一个变量等等。 Y 组合子函数 lambda calculus : λ 定义 通过 lambda , currying, closure, alpha, beta 可以定义出一个"完... 阅读详情

相关推荐

Kotlin 函数式编程(Kotlin Functional Programming)

Kotlin函数式编程 (KotlinFunctionalProgramming) 陈光剑 1.函数式概述6 1.1.函数式简史6 1.2.函数式编程语言家族7 1.2.1.概述7 1.2.2.函数式编程语言介绍8 1.3.函数式编程的特征10 1.3.1.函数是"第一等公民"(First-classandhigher-order...

AI天才研究院 1万+

无状态编程, lambda 表达式中传入的局部变量,为什么需要是不可变的(final)

本文将会根据以下顺序进行叙述:lambda 表达式中传入的局部变量,为什么需要是不可变的(final)?函数式编程提倡的无状态。无状态服务。

JellyfishMIX 的博客 1396

Functional Programming with C++.pdf

Functional Programming with C++. 100 pages pdf

什么是函数式编程(functional programming)?

什么是函数式编程(functional programming)?

商务合作欢迎私信我 2万+

Functional Programming pdf 2018

Explore functional programming and discover new ways of thinking about code. You know you need to master functional programming, but learning one functional language is only the start. In this book, through articles drawn from PragPub magazine and articles written specifically for this book, you'll explore functional thinking and functional style and idioms across languages. Led by expert guides, you'll discover the distinct strengths and approaches of Clojure, Elixir, Haskell, Scala, and Swift and learn which best suits your needs. Contributing authors: Rich Hickey, Stuart Halloway, Aaron Bedra, Michael Bevilacqua-Linn, Venkat Subramaniam, Paul Callaghan, Jose Valim, Dave Thomas, Natasha Murashev, Tony Hillerson, Josh Chisholm, and Bruce Tate. Functional programming is on the rise because it lets you write simpler, cleaner code, and its emphasis on immutability makes it ideal for maximizing the benefits of multiple cores and distributed solutions. So far nobody's invented the perfect functional language - each has its unique strengths. In Functional Programming: A PragPub Anthology, you'll investigate the philosophies, tools, and idioms of five different functional programming languages. See how Swift, the development language for iOS, encourages you to build highly scalable apps using functional techniques like map and reduce. Discover how Scala allows you to transition gently but deeply into functional programming without losing the benefits of the JVM, while with Lisp-based Clojure, you can plunge fully into the functional style. Learn about advanced functional concepts in Haskell, a pure functional language making powerful use of the type system with type inference and type classes. And see how functional programming is becoming more elegant and friendly with Elixir, a new functional language built on the powerful Erlang base.The industry has been embracing functional programming more and more, driven by the need for concurrency and parallelism. This collection of articles will lead you to mastering the functional approach to problem solving. So put on your explorer's hat and prepare to be surprised. The goal of exploration is always discovery. What You Need: Familiarity with one or more programming languages.

Functional Programming in C#.pdf

Functional Programming in C#.pdf C# 的函数式 编程 。 hope its help

面向对象编程与函数式编程(FP,functional programming)

面向对象编程和函数式编程都是编程模式。JavaScript 既支持面对对象编程,也支持函数式编程。

花铛 1238

Functional Programming in Java 无水印pdf

Functional Programming in Java 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

函数式编程的理解

这些示例展示了函数式编程在Python、JavaScript和Java中的一些特性和用法,包括高阶函数、纯函数、不可变性和延迟计算。

ydl1128的博客 1472

emacs使用简介

emacs工具的使用入门简介,配置,快捷键的使用

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

C# 函数式编程 Functional Programming 深度解析与实践

函数式编程是一种编程范式,其核心是将计算视为数学函数的求值。在函数式编程中,函数是第一等公民,可以像普通变量一样被传递、返回和存储。这种编程方式强调不可变数据、高阶函数和纯函数的使用,避免了传统命令式编程中的可变状态和副作用。不可变数据:在函数式编程中,数据一旦被创建,就不可被修改。这种不可变性使得程序的状态更加容易理解和预测,减少了并发编程中的复杂性。例如,在C#中,可以使用等不可变集合来存储数据,一旦创建,其内容就不可改变。高阶函数:高阶函数是指可以接受函数作为参数或返回函数的函数。

caifox的博客 1492

CloudCompare如何进行二次开发?

CloudCompare源代码编译成功后,即可进行二次开发,可以通过修改源码或者制作插件实现二次开发。本文二次开发采用修改CloudCompare的源代码的方式,分别修改mainwindow.ui、mainwindow.h、mainwindow.cpp,实现扩展功能,克隆选中的点云。

【cacrle】的博客 5331

【编程语言】函数式编程 Functional Programming

函数式编程 1. 引言 “函数式编程"是一种"编程范式”(programming paradigm),也就是如何编写程序的方法论。 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。它将计算看作数学函数的求值,避免了状态的变化和数据的变化。它是一种声明式编程范式,这意味着编程是用表达式(expressions)或声明(declarations)完成的而不是语句(stat...

ss的程序人生 6615

无需上下文,MCP新机制让大模型主动“提需”:节约 98% token 开销,并保持准确率基本不变!

值得注意的是,MCP 协议定义的服务器描述通常较为简洁。为了提升匹配效果,我们引入 Qwen2.5-72b-Instruct 模型,对所有服务器的原始资料(通常为 ReadMe 文档)进行总结提炼,参考其 capabilities、features、usage patterns 等要素,生成服务器的 summary 信息,作为相对详尽的描述文本用于匹配。然而,现有的 MCP 调用机制下,所有工具的描述信息都被注入大模型的系统提示词,导致了非常长的上下文开销,也为大模型的表现带来了影响,降低了模型的性能。

我爱计算机视觉 1171

ROC-RK3588S-PC 刷机 安装Android系统

rk3588刷机,装系统

Wjz_www的博客 4832

c#函数式编程 Functional Programming in C# [1]

第1部分 核心概念   在这一部分,我们将介绍函数式编程的基本技术和原理。   第 1 章首先介绍什么是函数式编程,以及 C# 如何支持函数式编程。然后深入研究高阶函数,这是 FP 的基本技术。   第 2 章解释了什么是纯函数,为什么纯度对函数的可测试性有重要影响,以及为什么纯函数很适合并行化和其他优化。   第 3 章介绍了设计类型和函数签名的原则——你以为自己知道但从函数的角度来看时会感到耳目一新的事情。   第 4 章介绍了 FP 的一些核心功能:Map、Bind、ForEach 和 Where(过

unity尧明的博客 2537

台达伺服B3驱动器参数的设定和CN1的接法

3. B2的电子齿轮比是直接设定P1-44(分子)和P1-45(分母)就就可以的,但是B3的有个隐藏的细节,就是P1-44的默认值77216不用去更改,这是官方客服说的,需要改的是P1-45这个参数,比如说,我使用的丝杆螺距是5mm的,那么就是以5000脉冲走完5mm为一圈,则就把P1-45设定为5000即可;我的是三菱FX3S系列的PLC,是NPN型的,输出点是24V-作为信号的,所以接41、37,具体可参考B3的。,跟着客服的讲解操作才解决的,以下就是解决方法,希望能够帮到需要的各位。

qq_38681017的博客 1万+

Functional Programming函数式编程

概论 在过去的近十年的时间里,面向对象编程大行其道。以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象。孰不知,在面向对象产生之前,在面向对象思想产生之前,函数式编程已经有了数十年的历史。 诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注。不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Er

u010443572的专栏 837

FMQL开发环境实战:从零构建国产FPGA SoC的软件基石

本文详细解析了构建国产复旦微FMQL FPGA SoC软件开发环境的完整流程。针对开发者在环境搭建中遇到的核心痛点,文章深入剖析了Procise、IAR与Vivado三大工具的协同角色与版本选择,提供了从软件下载、安装避坑到核心配置的实战指南,并总结了常见问题的排查方法,旨在帮助开发者高效跨过FMQL开发的“第一道坎”。

weixin_29215391的博客 125

学Simulink——基于AI融合与智能调度的场实例:联邦学习支持的多卫星协同通信建模

本文介绍了一种基于联邦学习的多卫星协同通信Simulink建模方法。系统采用"星-星协同+星-地协调"架构,每颗卫星本地训练LSTM链路预测模型,地面中心通过FedAvg算法聚合模型参数。建模过程包括卫星通信模型构建、联邦学习机制设计、协同决策系统开发等步骤,支持隐私保护、高效协同和智能决策。仿真结果表明,该方法在预测准确率(89%)、吞吐量(56.7Mbps)等方面优于独立训练模式,接近集中式训练性能。该方案为大规模卫星星座的智能协同提供了仿真验证平台,未来可拓展去中心化联邦学习、异构

xiaoheshang_123的博客 209

函数式编程(functional programming)学习总结

梳理一下函数式编程中的各个概念,会不定期更新。大部分是转载别人的文章,加一些感想,所以也不能算作原创。之所以会写这个是看到了分享的一个ppt: https://docs.google.com/presentation/d/1SwrUqNVVsHxmwmnT7QYsnf3b7gDi9lTZRD-4-wPLA28/edit#slide=id.p,我以前也接触过FP,但很少实际写,用FP比如scala写

BananaTree 2689

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1274

Python 函数式编程(Functional Programming)的特点与应用

Python 的函数式编程特性为开发者提供了强大的工具,使得代码更加简洁和可靠。尽管存在一定的学习成本,但掌握这一技能能够显著提升程序设计的质量。无论是应对复杂的业务逻辑还是优化性能瓶颈,函数式编程都能提供有力的支持。总之,函数式编程不仅是一种编程风格,更是一种思维方式。学会如何有效地运用函数式编程原则,将帮助你在软件开发过程中事半功倍。```

2501_91163674的博客 1735

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

函数式编程(Functional Programming)

函数式编程已经有比较长的历史了,如今的动态语言,很大程度上也受到了函数式编程(反过来名叫命令式编程)的启发。 在函数式编程语言中,当你写了一个函数,接受一些参数,那么当你调用这个函数时,影响函数调用的只可能是你传进去的参数,而你得到的也只能够是计算结果。因此,一个void的方法,是没有任何意义的。如果传入了引用类型的参数,也是不合要求的。 在函数式编程中访问状态是十分安全的,因为状态不会改变,我可以把一个Point或List对象交给任意多的地方去访问,完全不用担心副作用。函数式编程的十分容易并行,因为我

四火专栏 3903

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: TCP协议三次握手过程分析
下一篇: QTableWidget使用
静水若流深
博客等级 码龄14年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值