function programing
我们将代码将以名词(对象)的方式做分割,每个对象有某种形式的的标识符(self/this), 行为(方法)和状态(成员变量) 识别出名词并且定义出他们的行为之后, 再定义出名词之间的交互. 实现交互是存在一个问题,就是这些交互必须放在一个其中一个对象中. 现代面向对象设计倾向于定义出'服务类',将操作多个领域对象的方法集合放在里面. 他们虽然也是对象,但是不具备独立的状态,也没有与他们所操作对象无关的独立行为.
对象组合 封装有状态的交互 迭代算法 命令流
函数式编程方法通过组合和应用函数来构造软件.函数式编程倾向于将软件分解为其需要执行的行为或者操作. 自底向上的方法. 函数,纯粹对输入进行操作,产生结果. 变量不可变. 不变性有助于编写并发程序, 将副作用推迟到尽可能晚
函数组合 推迟副作用 递归算法 延迟计算 模式匹配
类型系统: 协变, 逆变, 类型推断
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 使用:
类型: 编译器要知道一组类型信息
变量是从哪个类型,实例化了
变量有那些方法
定义类 特质或对象
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)]