」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 範圍進展

範圍進展

發佈於2024-11-02
瀏覽:288

Scope progression

在命令式程式設計中,我們通常有如下所示的程式碼:

func addOneToSlice(xs []int) []int {
  rs := make([]int, len(xs))
  for i, value := range xs {
    rs[i] = value   1
  }
  return rs
}

但是,請注意有關 for 迴圈的以下幾點:

  • 每次迭代都有一個特定的目的,就是為目前元素加一。
  • 然而,每次迭代對於它可以操作哪個元素沒有限制。
  • 使用 xs[i 2] 和 rs[i 3] 進行操作不會從根本上改變我們的程式碼結構,同時會使最終結果不正確。

比較如何在 F# 中完成相同的任務:

let rec addOneToList =
  function
  | [] -> []
  | x :: xs -> x   1 :: addOneToList xs

現在考慮以下事項:

  • 我們有一個列表作為函數參數。
  • 函數式語言中的列表是鍊錶。
  • 鍊錶高效率、標準的操作是:
    • 將頭部 x 與尾部 xs 分開
    • 對頭部做某事 x
    • 將作為參數傳遞的列表與空列表進行比較[]

考慮到這些限制,向不在列表開頭的任何元素 y 添加 1 將顯著改變我們函數的結構。

現在比較兩種風格的計算進度:

  • 在函數式風格中,我們使用新值來建立一個新作用域,其中涉及在上面的範例中進行遞歸呼叫。
  • 在命令式風格中,我們在不改變範圍的情況下改變現有值。

在函數式風格中,將範圍與計算進度結合會產生以下結果:

  • 我們避免突變。
  • 執行流程明確。
  • 我們正在處理的結構變得清晰。
版本聲明 本文轉載於:https://dev.to/lamg/scope-progression-4iil?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3