関数型プログラミングが増えていますか?


42

私は最近、関数型プログラミング言語の人気が高まっていることに気付きましたTiobe Indexの人気が昨年と比較してどのように増加しているのかを最近見ましたが、このインデックスによると、それらのほとんどは最も人気のある上位50言語にさえ達していません。

そして、これはかなり以前からそうでした。関数型プログラミングは、他のモデルほど普及していません(つまり、オブジェクト指向プログラミング)。

関数型プログラミングの力に生まれ変わりましたが、マルチコアの人気が高まっているため、開発者はHaskellやErlangなどの言語で既に検討されている他の並行性モデルに関心を示し始めています。

コミュニティの大きな受け入れがないにもかかわらず、この種の言語がますます出現しているという事実に大きな関心を持っています。Clojure(2007)、Scala(2003)、F#(2002)は、最近の10年間のほんの3つの例です。

私自身、HaskellとScalaを学ぶのに時間を費やしてきました。そして、私は長い間そこにいたにもかかわらず、私にとっては新しいパラダイムに大きな可能性を見出しました。

そしてもちろん、私の最大の質問は、これらのいずれかが努力を検討するのに十分人気があるかどうかですが、これはすべての大騒ぎの人々がそれらについて作っているにもかかわらず、Mandrakeでさえ答えることができない質問です。

私が聞きたいのは:

  • 特定のタスクを実行するのにより適した関数型プログラミング言語を検討すべきシナリオはどれですか?並列プログラミングの最近人気のマルチコア問題に加えて。
  • 関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴になると思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。
  • 非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

さらなる研究のための推奨事項は大歓迎です。

私は意見を求めてウェブを検索しましたが、この新たな人気はすべて、ムーアの法則の壁にぶち当たろうとしているという考えから来ているようです。しかし、そうだとすれば、既存の一般的な言語がパラダイムに適応する可能性はもっと高いと思います。

おそらくこれらの言語を毎日使用する経験が豊富な人の中には、このテーマに関するより多くの洞察を提供できる人もいます。あなたの意見はすべて高く評価され、慎重に検討されます。

前もって感謝します!


4
EarlangではなくErlangです(あなたの投稿を編集していましたが、システムは1文字の編集を許可していません)。
quant_dev

6
言っておくと、関数型言語と命令型言語の間に明確な境界線はありません。MLファミリー言語には副作用がなく、命令型のステートメントと構造、および可変変数をサポートしています。いくつかの必須言語-私の頭の中でPythonとJavascriptの頂点にあるもの-は、関数型プログラミングから取った重要な機能を持っています。個人的には、主流の使用において、より機能的なアイデア、特にパターンマッチングを見てみたいと思います。
スティーブ314

1
関数型言語に共通のいくつかの機能があるからといって、必ずしも言語が「関数型」になるわけではありません。関数型プログラミングは、特定の言語機能と同様に、プログラムの考え方と設計の方法に関するものです。
ミパディ

2
@mipadi-したがって、使用可能なツールが許可する範囲で、機能哲学を任意の言語で適用できます。関数スタイルのコードをPythonで(制限内で)書くことができ、その範囲でPythonは関数型言語です。そして、あなたはMLで命令型のコードを書くことができ、その範囲でMLは命令型言語です。これは、「悪いプログラマーがFortranを任意の言語で書くことができる」とはまったく同じではありませんが、私の考えを誤って解釈した場合に陥りやすいのは明らかです。
スティーブ314

1
@mipadi-しかし、命令型言語にすべての通常の関数構造があれば、関数型言語でできることなら何でもできます。 「機能的/命令的な方法は何ですか」。MLファミリはすでにそのギャップを埋めていますが、機能的と呼ばれているため、そのスタイルは単に良いスタイルではなく機能的なスタイルだと考えています。
Steve314

回答:


24

特定のタスクを実行するのに適した関数型プログラミング言語をどのシナリオで検討する必要がありますか?並列プログラミングの最近人気のマルチコア問題に加えて。

多数の変換ステップを使用して、派生データ要素のシーケンスを作成することを含むもの。

基本的に、「スプレッドシートの問題」。初期データと、そのデータに適用する行ごとの計算のセットがあります。

本番アプリケーションは、データの統計的な要約を多数行います。これはすべて機能的にアプローチするのが最善です。

よくあることの1つは、3つの巨大なデータセット間の一致マージです。SQL結合に似ていますが、一般化されていません。この後に、派生データの多数の計算が続きます。これはすべて機能的な変換です。

アプリケーションはPythonで記述されていますが、ジェネレーター関数と不変の名前付きタプルを使用した機能スタイルで記述されています。これは、低レベルの機能の組み合わせです。

機能構成の具体例を次に示します。

for line in ( l.split(":") for l in ( l.strip() for l in someFile ) ):
    print line[0], line[3]

これは、関数型プログラミングがPythonのような言語に影響を与える1つの方法です。

時々、この種のものは次のように書かれます:

cleaned = ( l.strip() for l in someFile )
split = ( l.split(":") for l in cleaned )
for line in split:
     print line[0], line[3]

関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴はどれだと思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。

不変オブジェクトは最も難しいハードルです。

多くの場合、既存のオブジェクトを更新する代わりに、新しいオブジェクトを作成する値を計算します。オブジェクトの可変属性であるという考えは、破るのが難しい精神的習慣です。

派生プロパティまたはメソッド関数がより良いアプローチです。ステートフルオブジェクトは破壊するのが難しい習慣です。

非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

最初は関係ありません。学習する言語を選択してください。何かを知ったら、自分のニーズに合った別のものを選ぶことを検討してください。

Pythonに欠けているものを理解するためだけにHaskellを読みました。


5
@edalorzo:Pythonは弱く型付けされていません。非常に強く型付けされています。キャスト演算子はないため、JavaやC ++よりも強く型付けされています。
-S.ロット

5
@ S.Lott-静的型チェックは、IDEリファクタリングツールやインテリセンス型のものに役立ちませんか?バックグラウンドコンパイルを実行していて、型を静的にチェックしている場合、ツールでさらに自動化できるということではありませんか?テストで100%のコードカバレッジがある場合、それをキャッチすることに同意します。ただし、企業の実稼働コードのおそらく50%未満が実際に単体テストのカバレッジを持っていることを理解する必要があります。:)現実の世界は、我々が生きているがそこにある。
スコット・ホイットロック

8
@ S.Lott "静的型チェックはそれほど有用ではありません。コンパイラによる静的チェックまたは実行時チェックがあるかどうかは重要ではありません。同じ量のコードと同じ数の単体テストを記述します。 」エラー 静的型チェックの全体的なポイントは、バグをキャッチすることであり、その結果、必要なテストの量を大幅に削減します。
ジョンハロップ

3
@ S.Lott「Pythonは弱く型付けされていません。非常に強く型付けされています。」Pythonは暗黙的に数値型間でキャストしますが、これは弱い型指定です。
ジョンハロップ

3
@ Steve314「結局のところ、静的型チェックはいくつかの基本的なルールに適合するいくつかのエラーをキャッチします。原則として、単体テストはこれらのエラーすべてをキャッチできます。」いいえ。静的チェックは、プログラムの側面の正確性を証明します。単体テストは、正確性を反証しようとしますが、何の正確性も証明しません。単体テストは、静的型チェックや他の種類の証明に代わるものではありません。
ジョンハロップ

23

「機能的」とはさまざまな機能の集まりであり、それぞれが独立して有用であり、それぞれを個別に見る方が便利だと思います。

不変性

私はこれに精通しているので、不変の結果を返すことを逃れることができるときはいつでも、オブジェクト指向プログラムであっても常にそれをしようとします。値型のデータがある場合、プログラムについて推論するのは簡単です。通常、GUIやパフォーマンスのボトルネックのようなものには可変性が必要です。私のエンティティ(NHibernateを使用)も変更可能です(データベースに保存されたデータをモデリングしているため、これは理にかなっています)。

ファーストクラスタイプとしての機能

呼び出したいものは何でも、デリゲート、アクション、または関数を渡すことは、「中間パターンの穴」のような実世界の問題のクラス全体を解決するための本当に便利な方法です。また、デリゲート、アクション、または関数をオブジェクトに渡すことは、そのクラスがイベントを宣言し、そのイベントをフックする(通常は「リスナー」が1つだけであると仮定する)よりもクリーンであることがわかりました。リスナーが1つあることがわかっている場合、コールバックアクションをコンストラクターパラメーターとして渡すことができます(そして不変のメンバーに格納できます!)

関数を構成できること(たとえばAction<T>、単にに変換するActionことも、いくつかのシナリオで非常に便利です。

また、ここでLambda構文に注意する必要があります。これは、関数をファーストクラスタイプにプロモートするときにのみLambda構文を取得するためです。ラムダ構文は非常に表現力豊かで簡潔にできます。

モナド

確かに、これは私の弱点ですが、ワークフローなどのF#の計算ワークフローasyncはモナドであると理解しています。これは微妙ですが非常に強力な構造です。C#でクラスyieldを作成するために使用されるキーワードと同じくらい強力IEnumerableです。基本的には、内部で状態マシンを構築していますが、ロジックは線形に見えます。

遅延評価と再帰

これらは常に関数型プログラミングの機能としてまとめられていますが、そうでなければ命令型の言語に急速に移行し、もはや関数型と呼ぶのが難しいためです。

S式

私はこれをどこに置くべきかわからないと思いますが、Lisp S-ExpressionsやLINQ Expressionsなど、コンパイルされていないコードをオブジェクトとして扱う(そして検査/修正する)能力は、ある意味で、関数型プログラミングの最も強力なツール。ほとんどの新しい.NETの「流れるような」インターフェースとDSLは、ラムダ構文とLINQ式の組み合わせを使用して、非常に簡潔なAPIを作成します。Linq2Sql / Linq2Nhibernateは言うまでもなく、C#コードはC#コードではなくSQLとして「魔法のように」実行されます。

それはあなたの質問の最初の部分に対する長い答えでした...今...

関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴はどれだと思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。

私が直面した最大の落とし穴は、機能的ソリューションと命令的ソリューションの使用の間の境界線を見つけようとすることでした。ただし、両方のアプローチを数回試した後、どちらがよりうまくいくかを感じ始めます。

非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

.NETに慣れている場合は、F#を強くお勧めします。一方、JVMに精通している場合は、常にClojureがあります。あなたが実用的というよりもアカデミックであれば、Common LispまたはSchemeを使います。既にPythonを知っているなら、多くの機能的な構成要素が既に利用可能であると思います。


@Scott詳細な説明をありがとう。Haskellのような純粋な関数型プログラミング言語を使用することにより、最大の落とし穴としてあなたが説明することは、方程式から取り除かれると思います。それが私がそれを始めた理由です。私は一生ずっと命令型プログラマーでした。別の質問をしてもかまわないなら、私を心配しているのはツールとライブラリです。F#と他の.Netツールおよびライブラリとの統合はどの程度優れていますか?
エダロルゾ

実行時にコードをひとまとめにし、関数型プログラミングで実行時のコード生成と検査を行う理由がわかりません。2つは互いに関係がありません。説明するメタプログラミング機能は、機能的であろうとなかろうと、ほぼすべての言語に追加できます。Lispはデータトレンドとしてコードを始めたと思いますが、現在はルビーや他の非機能言語で利用可能です。
-davidk01

1
@edalorzo-F#と.NETの統合は非常に優れていますが、わずかな例外が1つだけあります。GUIデザイナーはありません。これを回避するには、C#アセンブリでGUIを設計してF#から参照するか、コードでのみ(デザイナーではなく)F#内でGUIを生成します。
スコットホイットロック

@ davidk01-メタプログラミングに関する良い質問。ラムダ構文とメタプログラミングが相互に構築されていることがわかりましたが、あなたは正しい、それらは分離される可能性があります。関数型言語でメタプログラミングを取得する可能性が高いようです。
スコット・ウィットロック

1
@Scott:私は多くの点で簡単だと思います-例えば、副作用を心配する必要がないとき、コードのセクションをその場でもっと自信を持って修正できます-それはあなたが変更しなければならないものを制限します。
マイケルK

15

そして、これはかなり以前からそうでした。関数型プログラミングは、他のモデルほど人気が​​ありません(つまり、オブジェクト指向プログラミング)。

これは、プロのプログラマー(または少なくとも自分自身をそのように見ている人々)によって開発されたプログラムを数える場合に当てはまります。ネットを広く広げて、そのように考えていない人々が開発したプログラムを含めると、FP(または少なくとも機能的なスタイルのプログラミング)はオブジェクト指向(Excel、Mathematica、Matlab、R ... )。

特定のタスクを実行するのに適した関数型プログラミング言語をどのシナリオで検討する必要がありますか?並列プログラミングの最近人気のマルチコア問題に加えて。

私個人の意見では、マルチコアはFPのキラー機能ではありません(少なくともHaskell、Scala、Clojure、F#コンパイラがキャッシュの局所性の問題を解決するまで)。キラー機能がありmapfilterfoldとアルゴリズムの大規模なグループのより簡潔発現を可能にする友人。これは、ほとんどの一般的なオブジェクト指向言語よりも簡潔な構文を持つFP言語によってさらに複雑になります。

さらに、FPがリレーショナルモデルに近いと、RDBMSとのインピーダンスのミスマッチが減少します。

また、「正確性」要件を満たすのが特に難しい場合-テストが困難な形式(科学計算/大規模データ分析で、以前は未知であり、そのような特定できない結果を得ることが目標である場合)でFPは提供できます利点。

関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴はどれだと思いますか?

  • ツールサポートの欠如(F#と一部のLispが例外で、Scalaが近づいています)
  • ハードウェアのパフォーマンスの最後の部分を絞り出すのが難しい
  • 多くの場合、商業ソフトウェア開発プロジェクトの大規模なグループが直面する問題とは異なる問題に焦点を当てたコミュニティ
  • FPを産業環境で使用した経験のある開発者はほとんどいないため、それらを見つけることができれば、おそらく金融業界が提供できる給与や利益と競争する必要があります。
  • プログラミングの機能的スタイルはデバッグが難しい傾向があります。すなわち、構成された関数の長いチェーンの結果の間に観察することは通常、ほとんどの(すべての?)デバッガーでは不可能です。

非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

  • どのプラットフォーム(JVMや.Netなど)でライブラリ/フレームワークを既に終了することで、いくつの問題を解決できますか?これらの問題を直接表現できる言語構成体はありますか?

  • アプリケーションのスペースと時間のパフォーマンスをどの程度低レベルで制御する必要がありますか?

  • あなたの「正確さ」の要件はどれくらい厳格ですか?

  • 開発者を再訓練したり、SW開発で非常に収益性の高いニッチが提供するメリットと競合したりする余裕はありますか?


+1 @Alexanderこれは確かにこの議論の中で最良の答えの一つです。人的要因、熟練した開発者を見つけてやる気を維持することの難しさを紹介することで、議論に新しい次元の議論をもたらしました。FPラングのキラー機能についてのあなたのビジョンに完全に同意します。これは、より多くの命令型言語がFPラングを採用していることも毎日見ているからです。しかし、あなたの投稿は、私がまだFPについて知らないことがたくさんあることに気づくために私の目を開きました。最後に、.NetやJavaのような既存のプラットフォームに基づくあなたのポイントは、確かに非常に有効であり、完全に賢明です。
エダロルゾ

9

関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴はどれだと思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。

あなたが業界のC ++ / C#/ Java開発者であると仮定して...

何も学びたくない不機嫌な仲間のために準備してください。「かつてコーダーだった」ために、悪い言語の選択を課す先のとがった髪のボスに備えてください。モノイドを愛用するフォーラムで、精巧な学者の準備をしてください。Scalaにはテールコールを削除する機能さえなく、Clojureはすべてのブラケットにフットペダルを必要とするため、Erlangの使用を開始しないでください。

あなたがウェブプログラマーなら、おそらく最大の落とし穴はあなたの髪でしょう。

非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

プラットフォームから始めましょう:

  • OCamlは、Linuxでは素晴らしく、Windowsではひどいです。
  • F#はWindowsでは素晴らしく、Linuxではひどいです。
  • ScalaとClojureはJVMで優れています。

1
「何も学びたくない不機嫌な仲間に備えてください」と読んだとき。私は大声で言いたかった:「本当に本当!しかし、それは本当に悲しいです。
ゼルフィアカルツスタール

3

この質問に関する1つの(明らかに偏った)視点については、Bob HarperのブログExistential Typeをご覧ください。カーネギーメロンは最近、CSカリキュラムを作り直し、関数型プログラミングを最初に教えました。他のパラダイムは、関数型プログラミングの確固たる基盤が確立された後に初めて教えられます。 。

HarperはStandard MLプログラミング言語の主要な開発者の1人であるため、この問題についての彼自身の意見は事前に推測できると言って差し支えありません。彼の場合も。


1
+1この記事は確かに非常に興味深いものであり、今後もお気に入りに保管していきます。FPを最初に教えることは確かに良いアプローチだと思います。なぜなら、そうしないと命令型の思考を取り除くことが本当に難しいからです。習慣。また、主要なOOP言語には機能的な機能が組み込まれているため、機能的なプログラマーのスキルと心の状態を身に付けることは、近い将来本当に役立つはずです。興味深い洞察、ありがとう!
エダロルゾ

@jimwise:Harperの記事の+1。彼のアプローチは非常に適切だと思います。@edalorzo:機能的に考え始めると、プログラムが十分に速くないときにプログラムを最適化するために適用しなければならない最後の手段として、命令型パラダイムを見ることができます。私は最近、Scalaでいくつかの小さなツールを書いています。非常に大きくはありませんが、些細なものではなく、実際の機能を備えています。驚いたことに、一度も使用したことがないvarか、変更可能なコレクションを使用していません。したがって、命令的思考はIMOであり、ある種の時期尚早な最適化であり、これはすべての人が知っているように、すべての悪の根源です。
ジョルジオ

2

特定のタスクを実行するのに適した関数型プログラミング言語をどのシナリオで検討する必要がありますか?並列プログラミングの最近人気のマルチコア問題に加えて。

関数型プログラミングをいつ使用するかを指示する魔法の公式はありません。オブジェクト指向プログラミングが現在のプログラミング状況に適しているというわけではありません。それは、抽象化の別のセットの観点からプログラムを構築する別の方法です。

関数型プログラミング言語に切り替えることにした場合、私が直面する最大の落とし穴はどれだと思いますか?(パラダイムの変更と、遅延評価によるパフォーマンスの評価の難しさに加えて)。

関数型プログラミングは怠とは関係ありません。MLとOCamlは機能的で厳密な言語です。直面する最大のハードルは、不変の値で物事を構造化し、副作用のために型システムで使用される抽象化に頭を包むことです。関数型言語は、型システムで副作用を非常に明確にするため、最適化に適しています。Haskellはモナドを使用しますが、純粋な関数型言語でエフェクトを使用する方法は他にもあります。Cleanには独自のタイプがあり、開発中の他の言語には他の言語があります。

非常に多くの関数型プログラミング言語がありますが、ニーズに合った言語をどのように選択しますか?

私が知っているプログラミング言語の中で、関数型言語と呼ぶことができるのはHaskellとCleanだけだと思います。他のすべてのものは、型システムで副作用を明示することなく副作用を許可します。したがって、関数型プログラミングの学習に時間を費やそうとしているのであれば、おそらくHaskellが唯一の法案に適しているでしょう。私が知っている他のすべてのもの、Erlang、Scala、Clojureなどは、命令型言語の上に機能的な抽象化を提供するだけです。機能的なパラダイムに少しずつアプローチしたい場合は、ScalaまたはErlangをお勧めします。一度にすべてに取り組み、欲求不満でgiveめたい場合は、Haskellを使用してください。


@ Dadivk01 +1 FPラングは他のモデルと同様の競争力のあるツールであり、他のモデルで解決された問題と同じ問題を解決するために使用できるという推論が好きです。では、なぜ彼らはあまり人気がないと思いますか?また、たとえばほとんどのOOP言語よりも、並列コンピューティングの問題を解決するのに適していることに同意しますか?不変のデータ型は、命令型のlangと比較した場合、メモリフットプリントとパフォーマンスに影響を与えますか?あなたは「欲求不満であきらめる」と言うでしょう、なぜ私は、Haskellのにチャンスを与えていた、あなたしている恐ろしい私、男:)
edalorzo

@edalorzo:並列アルゴリズムにとって関数型プログラミングの方が良いとは思いません。宣言型プログラミングと関数型プログラミングを混同します。関数型プログラミングの目的は、その宣言的性質と、宣言型コードをマシンコードに変換する優れたコンパイラーを作成する非常に賢明な人々です。マイナーな詳細を明示的に説明するのではなく、問題を記述することに重点を置いている他の言語は、並列プログラミングにも適しています。
-davidk01

@edalorzo:「フラストレーションをあきらめる」というのは、命令型プログラミングがすべてわかっていれば、haskellの型システムと効果を記述するためのモナド的なアプローチは少し多すぎるかもしれないからです。ErlangやScalaのような副作用に対してより実用的なアプローチをとる言語から始める方が良いと思います。
davidk01

0

関数型言語における興味の現在の上昇は、それらが並列コンピューティングに理想的であるという事実に起因すると思います。たとえば、map-reduceの全体的なアイデアは、機能的なパラダイムに基づいています。また、現在のスケールアウトがスケールアップよりもはるかに簡単で安価であることは明らかであるため、並列コンピューティングが普及することは間違いありません。消費者市場でもCPUはより多くのコアを取得し、GHzを取得しません。

編集:それはすべてに明らかではないので。

純粋な関数型プログラミングでは、関数は入力を受け取り、出力を生成し、副作用はありません。副作用がないということは、それが共有状態を持たないことを意味します。したがって、同期メカニズムは不要です。同期は、並行/並列ソフトウェアの最も難しい部分であり、したがって純粋に機能するため、基本的に最も難しい部分に対処する必要はまったくありません。

map-reduceに関しては、名前でさえ関数型プログラミングに由来しています(マッピングと還元の両方は、関数型パラダイムの典型的な操作です)。map-reduceの両方のステップは関数であり、並行して実行され、入力を受け取り、出力を生成し、副作用はありません。これはまさに関数型プログラミングのアイデアです。

並列処理に使用されるFPのいくつかの例:

  • CouchDB-Erlangでビルド
  • Facebookチャット-Erlang上に構築
  • Twitter-大部分はScala上に構築

3
誰もが並列プログラミングを主張していますが、それをバックアップするデータはほとんどありません。そのようなソースを知っている場合は、引用する必要があります。複雑な計算には多くの場合、複雑なデータ依存関係があり、関数型プログラミングパラダイムを使用すると、一部のモデルに固有のデータ相互依存性が魔法のように消えることはありません。それはにつれてGPUプログラミングは、並列の通りですが、モデルは、彼らが組み込まれてい並列度で動作するため、彼らはただ罰金命令型言語を使用して取得します。
davidk01

4
@vartec:客観性のために、あなたの主張を裏付ける参考文献を提供できればそれでもいいでしょう。それは、無知な読者が
反問

1
@vartec:実はいや、多くの人が何らかの主張をしてそれを真実にしたということは私には決して起こりませんでした。私は数学のトレーニングを非難しますが、私たちのすべてが私たちの主張の難しい事実や具体的な正当化のようなことを信じているわけではなく、あなたの編集はまだ私のコメントに対応していません。
-davidk01

1
@vartecあなたの主張を裏付ける信頼できる情報源への参照を置くことができます。
quant_dev

1
+1 @ davidk01「誰もが並列プログラミングを主張していますが、バックアップするデータはほとんどありません」。それとは逆に、膨大な量の証拠を知っています。たとえば、Cilkの論文では、マルチコアでのスケーラブルな並列処理の要件である適切なキャッシュの複雑さが必要な場合、インプレースミューテーションがどのように不可欠であるかについて説明しています。
ジョンハロップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.