- #125
- #124
为什么不惰性求值(Lazy Evaluation)一切事物?
惰性求值(Lazy)可以延后计算的发生时机,直到真正需要结果时才执行,这不仅节省了不必要的运算,也让流程控制更具弹性。
那为什么不干脆所有运算都惰性化?
虽然能减少即時計算成本,但它同时也推迟了错误的发生时机。在 eager (即时求值)模式下错误通常能在执行流程早期就被捕捉;而在 lazy 模式中,错误可能延迟到资料被实际取用时才爆发,导致除错流程更分散且难以追踪。(Functional Programming 设计上避免副作用来避免该问题,且很多 FP 语言设计上 lazy 为默认策略)
惰性求值需要一套额外的执行模型来「记得」哪些值尚未被计算,这在语言执行层面上通常意味着更多的包装与更多的内存负担。(可以把副作用包成明确的 thunk / effect,并在你控制的地方调用它(或用 Effect/IO Monad)
惰性求值是一种延迟决策的策略,当数据流庞大、结果并非全都需要时,它能显著提升效率;然而在需要可预测执行顺序或明确副作用时,eager 模式反而更可靠。
function* process(items) {for (const it of items) {yield doSideEffect(it);}}// 调用者没有 iterate => 不会发生副作用const gen = process([1,2,3]);// 只有在下面这行执行时,副作用才会被触发for (const p of gen) - #123
- #122
- #121
- #120
- #119
- #118
- #117
- #116
- #115
- #114
- #113
- #112
- #111
- #110
- #109
- #108
- #107
- #106
- #105
- #104
- #103
- #102
- #101
- #100
- #99
- #98
- #97
- #96
- #95
- #94
- #93
- #92
- #91
- #90
- #89
- #88
- #87
- #86
- #85
- #84
- #83
- #82
- #81
- #80
- #79
- #78
- #77
- #76
- #75
- #74
- #73
- #72
- #71
- #70
- #69
- #68
- #67
- #66
- #65
- #64
- #63
- #62
- #61
- #60
- #59
- #58
- #57
- #56
- #55
- #54
- #53
- #52
- #51
- #50
- #49
- #48
- #47
- #46
- #45
- #44
- #43
- #42
- #41
- #40
- #39
- #38
- #37
- #36
- #35
- #34
- #33
- #32
- #31
- #30
- #29
- #28
- #27
- #26
- #25
- #24
- #23
- #22
- #21
- #20
- #19
- #18
- #17
- #16
- #15
- #14
- #13
- #12
- #11
- #10
- #9
- #8
- #7
- #6
- #5
- #4
- #3
- #2
- #1