- #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