首页 > 代码库 > Functional Programming Principles in ScalaScala函式编程原理 第一章笔记

Functional Programming Principles in ScalaScala函式编程原理 第一章笔记

所有non-trival编程语言都提供了

  • 基本表达式(expression)去表示最简单的表达式
  • 组合表达式的方法
  • 抽象表达式的方法,也就是为表达式引入一个名字去引用它

substitional model 替代模型

sumOfSquares(3,2+2)

sumOfSquares(3,4)

square(3)+square(4)

9+square(4)

9+16

25

这种模型的核心概念是所有的表达式都规约成值,替代模型在lamada表达式中被形式化,构成了函数式编程的基石

substitional model只能被用于对没有side effect的表达式求值

side effect比如表达式 a++

每个表达式都能在有限步内规约成一个值吗?

答案是不行!

def loop:int = loop

当调用loop的时候发生

loop->loop->loop->loop->........

再看另一种求值方法

sumOfSquare(3,2+2)

Square(3)+Square(2+2)

3*3+Square(2+2)

9+(2+2)*(2+2) //这里参数被计算了多次

9+4*(2+2)

9+4*4

9+16

25

第一种叫call-by-value,第二种叫call-by-name

对于一个表达式这两种方式会规约成同一个值,只要保证

  • 被规约的式子包含pure functions,并且每个求值过程都是可终止(有限)的

call-by-value的好处是每个函数的参数只被计算一次,call-by-name的好处是如果一个参数没用,那么它不会被计算