所有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的好处是如果一个参数没用,那么它不会被计算
Functional Programming Principles in ScalaScala函式编程原理 第一章笔记,布布扣,bubuko.com
时间: 2024-10-03 20:42:49