函数式编程

函数式编程入门经典!函数永远是"一等公名"!

删除回忆录丶 提交于 2020-01-15 01:32:48
一.什么是函数式编程? 函数式编程思想来源于伟大数学家阿隆佐设计的lambda验算,是指用函数来解决与计算相关的几乎所有问题。与我们平时常见的指令式编程相对,也是一种典型的编程范式。举个例子。 需要计算的数学表达式为 : 指令式的编程方式如下: 而函数式编程则会将每一个运算过程定义为不同的函数,编程方式如下: 从以上的对比例子可以看出,和面向对象编程以对象为模块的思想一样,函数式编程是以函数为核心来组织模块的,这种组织方式更有利于写出模块化的代码。 二.函数式编程的基本准则 与学习面向对象编程一样,函数式编程同样有几个鲜明的特点,需要我们在编程时牢记。 1.函数永远是“一等公民” 所谓一等公民是指,函数与我们平时所使用的其他数据类型地位一样: (1) 可以赋值给一个变量 (2) 可以作为参数进行传递 (3) 可以作为别的函数的返回值 将函数作为一等公民有利用代码的模块化,接下来我们来举个例子: 程序需要完成的目标: 函数不是一等公民的情况: 函数是一等公民的情况: 从以上例子可以看出,函数式编程的模块化程度更高,且代码量更少 2.尽量写“纯函数” 所谓纯函数是指,给定相同输入总能得到相同输出的函数。纯函数需要同时满足下面两个条件:    (1) 函数的结果只依赖于输入的参数且与外部变量和环境无关——只要输入相同,返回值总是不变的。    (2) 除了返回值外,不修改程序的外部状态

函数式编程—高阶函数

无人久伴 提交于 2020-01-13 18:01:34
一、函数式编程概念简介 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元 就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 函数式编程最重要的概念就是:组合;一个函数只做一件事, 保证内部不被修改,且干净,无副作用,遵循开闭原则,然后将多个函数组合一起,便是简单的函数式编程范式 二、高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 map() 函数接收两个参数,一个是函数, 一个是 Iterable , map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 Iterator 返回 re duce

从java8 说起函数式编程

笑着哭i 提交于 2020-01-03 17:19:38
写在前面 为什么要用函数式编程。看例子: final List<BigDecimal> prices = Arrays.asList( new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"), new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"), new BigDecimal("45"), new BigDecimal("12")); BigDecimal totalOfDiscountedPrices = BigDecimal.ZERO; for(BigDecimal price : prices) { if(price.compareTo(BigDecimal.valueOf(20)) > 0) totalOfDiscountedPrices = totalOfDiscountedPrices.add(price.multiply(BigDecimal.valueOf(0.9))); } System.out.println("Total of discounted prices: " + totalOfDiscountedPrices); 更优雅的方式,是使用声明式的代码: final BigDecimal

编程范式

China☆狼群 提交于 2020-01-01 12:27:08
编程语言有很多种流派和思想,有一些编程语言同时支持多种编程范式。 静态类型编程范式 采用静态类型编程范式的编程语言,其变量需要明确指定类型。代表语言有C、C++、Pascal、Objective-C、Java、C#、VB、.NET、Swif和Golang等。 这种范式认为,程序员肯定知道变量的类型,你丫要是不知道变量的类型,那你就别混了!编译时,如果变量类型对应不上,程序就会报错。 静态类型的好处 1.编译器可以在编译时就能找出类型错误。 2.编译器编译时知道类型信息,就可以提高性能。 此外,Swift和Go语言虽然都是静态类型编程语言,但它们都不需要明确指定类型,而是可以通过推断由编译器自动确定其类型。 动态类型编程范式 采用静态类型编程范式的编程语言,其变量不需要明确指定类型。任意变量,可以指向任意类型的对象。代表语言有Python、Ruby和JavaScript。 动态类型的哲学可以用鸭子类型(Ducktyping)这个概念来概括。JamesWhitcombRiley提出的鸭子测试可以这样表述:当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 这种范式认为,程序员肯定知道变量的类型和它支持的方法和属性,你丫要是不知道变量的类型,那你就别混了!运行时程序会崩溃!程序崩溃怨谁?怨你自己呗,你不是合格的程序员! 动态类型的好处

函数式编程学习之路(四)

对着背影说爱祢 提交于 2019-12-24 18:01:30
知识点理解一: 函数: 函数(function)表示每个输入值对应唯一输出值的一种对应关系。函数f中对应输入值的输出值x的标准符号为 f(x) 。包含某个函数所有的输入值的集合被称作这个函数的 定义域 ,包含所有的输出值的集合被称作 值域 。若先定义映射的概念,可以简单定义函数为,定义在非空数集之间的映射称为函数。 高阶函数: 在 数学 和 计算机科学 中, 高阶函数 是至少满足下列一个条件的 函数 : 接受一个或多个函数作为输入 输出一个函数 在数学中它们也叫做 算子 (运算符)或 泛函 。 微积分 中的 导数 就是常见的例子,因为它映射一个函数到另一个函数。 在 无类型 lambda 演算 ,所有函数都是高阶的;在 有类型 lambda 演算 (大多数 函数式编程语言 都从中演化而来)中,高阶函数一般是那些函数型别包含多于一个箭头的函数。在函数式编程中,返回另一个函数的高阶函数被称为 Curry化 的函数。 柯里化( Currying ): 在 计算机科学 中, 柯里化 ( Currying ),是把接受多个 参数 的 函数 变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 哈斯凯尔·加里 命名的,尽管它是 Moses Schönfinkel 和

[学习] 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑

只愿长相守 提交于 2019-12-23 01:04:29
函数式编程 阮一峰 《 函数式编程初探 》,阮一峰是《黑客与画家》的译者。 wiki 《 函数编程语言 》 一本好书,《 计算机程序的构造与解释 》有讲到scheme lisp, 不过是作为工具。重点还是再讲方法论,虽然只看了前言,已经觉得是非常好的书,非常有高度。 写这段话的人叫 艾伦佩利 。他为这本书做的序,写的更好。非常有高度,非常有智慧,即使不读这本书,也推荐读一下序。 《解释》是作为MIT的课程教材。其中提到了另一门课 6.231 可以作为该可的前导学习。也对应了一本英文版的教材《 dynamic programing and Optimal control 》,不过我没看,也没有列入计划。 lambda演算 0 我试图想要总结或者抄录一句话来定义,什么叫lambda演算,遗憾的是没有成功找到一句简洁又明晰的。如果一定要找一个的话,可能是这样的: 1 一篇轻松又好读的译文: 我的最爱Lambda演算——开篇 2 函数式编程的重要性在于lambda演算,而lambda演算则牵扯到了数学和公理体系。 理解 函数式编程 最重要的是理解什么是 lambda演算 ,理解lambda演算最重要的是理解什么是 函数 ,以及什么是 高阶函数 。 见 << lambda.pdf >> 柯里化:把任意多参数函数都转换成单参数的高阶函数。 个人理解:原来一切都是从lambda运行演进出来的

Scala 函数式编程_高阶函数_Higher Order Function

爱⌒轻易说出口 提交于 2019-12-22 20:03:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Scala 函数式编程_高阶函数_Higher Order Function 高阶函数的基础就是 函数作为参数传递给另外一个函数,作为参数的函数可以是匿名函数或者函数字面量,也包括用def 关键字定义的函数。 http://my.oschina.net/xinxingegeya/blog/359335 http://my.oschina.net/xinxingegeya/blog/359280 什么是函数式编程 In computer science, functional programming is a programming paradigm(范式) that treats computation as the evaluation of mathematical(数学上的) functions and avoids state and mutable data. 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算, 并且避免了状态以及变量的概念 。 可以通过下面这个链接来了解函数式编程 参考文章 http://www.cnblogs.com/kym/archive/2011/03/07/1976519.html http://www.ibm.com/developerworks/cn

ES6函数式编程笔记-1

眉间皱痕 提交于 2019-12-22 03:55:12
好书 ( 强推 掌握ES6 的一些基本即可试读 本书由浅入深 层层递进 书中代码仓库 一些概念及代码 一等公民 当一门 允许函数作为任何其他数据使用时 合理代码 必要的注释 见名知意 函数不应依赖全局变量 若并发执行 结果难以预料 闭包函数 作用域 自身内声明变量 全局变量访问 对外部函数变量访问 高阶函数 Higher-Order Function( HOC ) 以函数作为参数 并且或者返回函数作为输出的函数 抽象 将独特功能 做成通用功能 // 仅执行一次的函数 const once = (fn) => { let done = false return function() { // 此处括号用的精妙 return done ? undefined : (done=true, fn.apply(this, arguments)) } } // 缓存 const memoized = (fn) => { const lookupTable = {} // 此处返回值 用的精妙 可参考例1运行结果 return (arg) => lookupTable[arg] || (lookupTable[arg]=fn(arg)) } // 例1 var o = { a : 7, get a(){return 1;},//死循环 set a(){} }; var a = () => (o

Java函数式编程和lambda表达式

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-21 23:24:23
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论。函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。说白了,函数式编程是基于某种语法或调用API去进行编程。例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8}; int min = Integer.MAX_VALUE; for (int num : nums) { if (num < min) { min = num; } } System.out.println(min); } 而使用函数式编程进行实现的话,所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8}; int min = IntStream.of(nums).min().getAsInt(); System.out.println(min); } 从以上的两个例子中,可以看出,命令式编程需要自己去实现具体的逻辑细节

JavaScript函数式编程——JavaScript基础

你离开我真会死。 提交于 2019-12-16 07:01:56
JavaScript基础 理解JavaScript语言 JavaScript函数式语言的血统更多一些。 函数式一等公民(一等对象)。函数与其他对象共存,并且能够像任何其他对象一样地使用 函数闭包 作用域 基于原型的面向对象 对于其他特性: 生成器:一种能够基于一次请求生成多次值的函数,不同的请求之间也能挂起执行 Promise:让我们更好地控制异步代码 代理:控制对特定对象的访问 高级数据方法 Map:用于创建字典集合 Set:处理仅包含不重复项目集合 正则表达式:简化用代码书写起来很复杂的逻辑。 模块:把代码划分为较小的可以自包含的片段,使项目更容易管理。 转换编译器 为了能够支持旧的浏览器,解决这个问题的方法之一是使用转换编译器transpilers(转换器+编译器:transformation + compiling)。能够将前沿的JavaScript代码转换为等价的能够在当前浏览器中运行的代码 常用的转换编译器为:Traceur和Babel 理解浏览器 主要的概念: 文档对象模型(DOM):DOM是Web应用的结构化的UI表现形式。 事件:大部分JavaScript应用都是事件驱动的应用,表示大部分代码执行在对某个特殊事件响应的上下文 浏览器API:帮助我们与世界交互,浏览器提供获取设备的信息、存储本地数据或远程浏览器交互的API。 最佳实践 调试