「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > スコープの進行

スコープの進行

2024 年 11 月 2 日に公開
ブラウズ:647

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