bobzhangwz
6/22/2018 - 12:34 PM

function programing

function programing

函数式编程

面向对象编程

我们将代码将以名词(对象)的方式做分割,每个对象有某种形式的的标识符(self/this), 行为(方法)和状态(成员变量) 识别出名词并且定义出他们的行为之后, 再定义出名词之间的交互. 实现交互是存在一个问题,就是这些交互必须放在一个其中一个对象中. 现代面向对象设计倾向于定义出'服务类',将操作多个领域对象的方法集合放在里面. 他们虽然也是对象,但是不具备独立的状态,也没有与他们所操作对象无关的独立行为.

对象组合 封装有状态的交互 迭代算法 命令流

函数式编程

函数式编程方法通过组合和应用函数来构造软件.函数式编程倾向于将软件分解为其需要执行的行为或者操作. 自底向上的方法. 函数,纯粹对输入进行操作,产生结果. 变量不可变. 不变性有助于编写并发程序, 将副作用推迟到尽可能晚

函数组合 推迟副作用 递归算法 延迟计算 模式匹配

scala

类型系统: 协变, 逆变, 类型推断

implicit 关键字

[T <% Ordered[T]], T 可以被隐式转换为 Ordered[T], implicit T => Ordered[T]

表达式 和 语句区别: 表达式有返回值 scala 中的方法

可变性 不变性(函数式编程的基石): 找到创建地方,就能确定其状态

null/ None, Option 后边的代码不受污染

lift3[A, B](f: Function1[A, B]): Function1[Option[A], Option[B]]
implicity[]
def b: Bar.type

implicits 使用:

  1. 包对象
  2. 带 Implicites 后缀的单例对象

类型: 编译器要知道一组类型信息

  1. 变量是从哪个类型,实例化了

  2. 变量有那些方法

  3. 定义类 特质或对象

  4. type 关键字定义类型

foo.Bar
Foo#Bar

类型多态

A <:< B


sequence: List[Option[A]] => Option[List[A]]
lift: (a: List[A])(f: A => Option[B]): Option[List[B]]

replicateM[A](n: Int, fa: F[A]):F[List[A]]
product(fa: F[A], fb: F[B]): F[(A, B)]