惰性求值-Lazy evaluation

惰性方法是指一系列嵌套的方法的求值被延迟到一个求值(方法|表达式)的出现。
用haskell做说明的话

print (drop 2 "abcd")

drop 不是一个求值方法,而print 是一个求值方法,所以其实是print 导致了 (drop 2 “abcd”)被求值。

在上面这种简单的情况下可能看不出惰性求值的作用,我们看一个比较复杂的例子

sum (takeWhile (<10000) [m | m <- [n^2 | n <- [1..]], odd m])

[1..]代表一个无限长的list,可想而知,如果他先被求值的话,整个程序就会立即崩溃了。
上面的最终求值方法是sum,takeWhile ,方法是先从最外面执行,而里面的一堆方法,会被看成一个需要被求值的块,直到真正需要值的时候之前,求值块不会被求值,所以等到[1..]需要被求值的时候,是用takeWhile (<10000)来对他进行求值,保证他只有10000个元素,而不是一个无限长的list。

惰性求值有很多好处,java8的流类也是惰性求值的,用过的人应该会比较清楚,stream是不会被直接求值的,除非对它使用一个终止方法,例如collect,而在调用求值方法的时候,之前积累的方法可以被优化,例如filter,map可能会被压缩到一次循环中,而在非惰性求值中,就是两次循环。

惰性求值一般常出现于函数式语言,或者某些语言的函数式框架中,像java8的stream,rxjava之类的


我的github
https://github.com/luckyCatMiao

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值