函数式编程笔记 01
Cousera 上 Functional Programming Prinples in Scala 的笔记。
编程范式
范式描述了某些科学学科中独特的概念或者思考模式。
主要的编程范式:
- 命令式编程
- 函数式编程
- 逻辑式编程
与它正交:
- 面向对象编程
命令式编程
- 修改可变变量
- 赋值
- 诸如if-then-else、loops、break、continue、return等的控制结构
简单来理解,命令式编程就是Von Neumann计算机上的指令序列。
命令式的程序和计算机
- 可变变量 ≈ 内存单元
- 变量解引用 ≈ load指令
- 变量赋值 ≈ store指令
- 控制结构 ≈ jump指令
这在程序规模变大时会出现问题。怎样才能避免逐字的翻译式的编程?
John Backus 1978年在Turing Award上的讲稿:Can Programming be Liberated from the von. Neumann Style?
Jone Backus是第一个高级语言Fortran的发明者。
规模增大
纯命令式编程被Von Neumann所限制:
“One tends to conceptualize data structures word-by-word”
需要其他的方式来定义类似于集合、多项式、几何图形、串、文档等这些高级的抽象。
理想的方法是提出集合、形状、串等的定理。
什么是定理
定理包括
- 一个或多个数据类型
- 这些类型上的运算符
- 值和运算符之间关系的规则
定理并不描述变化!
定理不包括变化
一个定义两个多项式的和的例子:
(a * x + b) + (c * x + d) = (x + c) * x + (b + d)
复制代码
它并没有定义一个在改变系数的同时保持多项式相等的运算符!
但是在命令式编程中却可以这样写:
class Polynomial { double[] coefficient; }
Polynomial p = …;
p.coefficient[0] = 42;
复制代码
(系数coefficient[0]
变了但多项式p
没变)
另外一个例子是字符串中的++
运算符:
(a ++ b) ++ c = a ++ (b ++ c)
复制代码
它并没有定义一个在改变序列元素的同时保持序列相等的运算符!
Java在这儿做的不错……它的String是不可变的。
对编程的影响
如果想根据它们的数学定理来实现高级概念,那就没有变化的地方。
- 数学不承认它
- 变化会毁掉定理中有用的规律
因此
- 用函数来表达运算符的定理
- 避免变化
- 有了一个强大的方法来抽象和构造函数
函数式编程
- 在狭义上,函数式编程意味着没有可变变量,赋值,循环和其他的命令式控制结构
- 在广义上,函数式编程意味着专注于函数
- 特别是,函数可以是能被产生、消耗和构造的值
- 这在函数式语言中都特别简单
函数式编程语言
函数是一等公民。
- 在任何地方都可以被定义,包括在另一个函数内部
- 像其他值一样,可以作为参数传递给其他函数,也可以作为值返回
- 像其他值一样,有一套构造函数的运算符
狭义上的函数式编程语言:
- Pure Lisp, XSLT, XPath, XQuery, FP
- Haskell (without I/O Monad or UnsafPerformIO)
广义上的函数式编程语言:
- Lisp, Scheme, Racket, Clojure
- SML, Ocaml, F#
- Haskell (full language)
- Scala
- Smalltalk, Ruby
函数式编程语言历史
- 1959 - Lisp
- 1975-77 - ML, FP, Scheme
- 1978 - Smalltalk
- 1986 - Standard ML
- 1990 - Haskell, Erlang
- 1999 - XSLT
- 2000 - OCaml
- 2003 - scala, XQuery
- 2005 - F#
- 2007 - Clojure
资源
Leaning Resources
函数式编程笔记 01相关推荐
- 闭关之 C++ 函数式编程笔记(一):函数式编程与函数对象
目录 前言 第一章 函数式编程简介 1.1 命令式与声明式编程比较 1.2 纯函数(Pure functions) 1.2.1 避免可变状态 1.3 以函数方式思考问题 1.4 函数式编程的优点 1. ...
- 闭关之 C++ 函数式编程笔记(四):monad 和 模板元编程
目录 第十章 monad 注意 10.1 仿函数并不是以前的仿函数 10.1.1 处理可选值 10.2 monad: 更强大的仿函数 10.3 基本的例子 10.4 range 与 monad 的嵌套 ...
- scala函数式编程笔记: 纯函数式状态
scala函数式编程:纯函数式状态读书笔记 Overview: 带状态的方法的声明式实现可能带有副作用,难以保持引用透明. 以纯函数式的方式实现带状态的函数的关键在于让状态更新是显式的,不要以副作用方 ...
- java8函数式编程笔记-科里化
java函数式编程-科里化 什么是函数? 在数学上,函数的定义为"它接受零个或多个参数,生成一个或多个结果" 而在java8中,函数的定义为像数学函数一样没有副作用的函数 复制代码 ...
- 闭关之 C++ 函数式编程笔记(五):系统设计和程序测试
目录 第12章 并发系统的函数式设计 12.1 Actor 模型:组件思想 12.2 创建简单的消息源 12.3 将反应流建模为 monad 12.3.1 创建宿 (sink) 接收消息 12.3.2 ...
- 闭关之 C++ 函数式编程笔记(二):偏函数、组合、可变状态与惰性求值
目录 第四章 以旧函数创建新函数 4.1 偏函数应用 4.1.1 把二元函数转成一元函数的通用方法 4.1.2 使用 std::bind 绑定值到特定的函数参数 4.1.3 二元函数参数的反转 (这节 ...
- 苏晓茂的java面向对象核心编程笔记01
包装类 1.包装类 基本数据类型的引用类型 byte------->Byte short------>Short int-------->Integer char-------> ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...
- Python学习笔记__4章 函数式编程
# 这是学习廖雪峰老师python教程的学习笔记 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程 ...
最新文章
- 【leetcode】力扣刷题(2):两数相加(go语言)
- 聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
- SAP LSMW 物料主数据导入毛重净重放大1000倍问题之对策
- 信息系统安全等级保护的定级准则和等级划分
- jquery中filter、find、children、contents、contains区别
- TQ210 —— 点亮LED
- 新手关于如何看编程经典书的一些疑惑?
- 嵌入式中常见的存储器总结(二)SRAM VS DRAM
- OpenCV学习笔记:视频处理
- java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列操作...
- java foreach跳出本次循环_java控制流程最全示例
- pythonplatform标识_Python utils.platform方法代码示例
- ThinkPHP3.2.3完全开发手册离线手册
- 利用VS的代码优化和openmp并行计算提高程序运行速度
- vt版本不见了_王者荣耀VT版本玩法是什么?修改机型玩VT版方法是什么?
- JAVA图灵 自动回复_实现微信公众号聊天机器人,自动回复——nodejs+图灵机器人...
- nodejs--数据库与身份验证:初识数据库、安装并配置 MySQL、MySQL 的基本使用、SQL语法、在项目中操作 MySQL
- STM32驱动_cc2420
- mysql_backups
- oppo手机安装应用失败,提示版本不兼容