質問

って学習プログラミング(具体的にはウが、私はそれを通してチュートリアルLisp、Gimp用ドキュメけます)。がこの概念は非常に言いなさんの実質的側面の"副作用"がコンセプト。その実践的な優位性かしていただきたいと思います。ようにしていると考え、機能的な考え方であるが、一部の状況を見過度に複雑なの保存状態を手軽に行うことができ私は考えてウのmonads'や').

であり続けを学ぶウ(または別の純粋な機能的な言語)です。が機能的又は無国籍ング実は以上の手続き?あるいは、今後ともウや他の機能言語の後に、あるいはIしているので、これからのみへの理解を深める?

私は考える余性能により生産性が向上。さんの心に問いかに生産的で機能的な言語による手続き/ブジェクト指向に/ある。

役に立ちましたか?

解決

他のヒント

他の回答の多くは、私は非常に重要であると考えている関数型プログラミングの性能(並列処理)側に焦点を当てています。 、あなたがより速く、機能パラダイムにおける不可欠なパラダイムに比べて、同じことをプログラムすることができますのようにしかし、あなたは具体的には、生産性について尋ねました。

私は実際にはF#でそのプログラミングは私がより良い考え方と一致した(個人的な経験から)を見つけると、それは簡単です。私はそれが最大の違いだと思います。私はF#とC#の両方でプログラムしましたし、あまり私は大好きF#で、「言語の戦い」がたくさんあります。あなたは、F#での詳細について考える必要はありません。ここで私は、私が本当に楽しんで見つけたもののいくつかの例です。

は、例えば、F#は静的(すべてのタイプはコンパイル時に解決されている)入力されていても、型推論は、あなたがそれを言う必要はありませんので、あなたは、持っているもののタイプの割り出し。それはそれを把握することができない場合、それは自動的にあなたの関数/クラス/どんなジェネリックになります。だから、それはすべての自動何でも任意のジェネリックを記述する必要はありません。私はそれは私が問題とそれを実装する方法を以下のことを考え、より多くの時間を費やしてる意味を見つけます。実際に、私は戻ってC#に来る時はいつでも、私は本当にこの型推論を欠場見つけ、あなたはもうそれを行う必要はありませんまで、それがどのように邪魔実現することはありません。

また、F#で、代わりにループを書くのには、関数を呼び出します。あなたはもうループ構造を考える必要はありませんので、微妙な変更が、重要なのです。例えば、ここを通過し、何かにマッチするコードの一部は(私はそれがプロジェクトオイラーのパズルから何、覚えていないことができます)です。

let matchingFactors =
    factors
    |> Seq.filter (fun x -> largestPalindrome % x = 0)
    |> Seq.map (fun x -> (x, largestPalindrome / x))

私はC#で(つまり、各要素の変換です)、マップをフィルタを行うことは非常に簡単になることを実現していますが、低いレベルで考える必要があります。特に、あなたはループ自体を記述する必要があり、そしてあなた自身の明示的なif文を持って、物事のこれらの種類のだろう。 F#のを学んでいるので、私はそれが簡単にあなたがフィルタリングしたい場合は、あなたが「フィルタ」を書き込む機能的な方法でコーディングすることが分かってきましたが実現しました、そしてあなたがマップする場合は、「マップ」の書き込み、代わりの実装します詳細の各。

私はOCamlでからのF#を分離し、そしておそらく他の関数型言語だと思う>演算子、|

私も大好きです。それは他の式の入力にあなたは「パイプ」1式の出力をすることができ、配管作業です。これは、コードが、私はより多くをどのように考えるか追従させます。上記のコードスニペットのように、それは「それをマッピングし、それをフィルタリングする、要因のシーケンスを取る。」と言っていますそれはあなたがループを書いて、if文とても忙しいので、あなたは命令型プログラミング言語で得ることはありません思考の非常に高いレベルの、です。それは私が他の言語に行く時はいつでも私が最も欠場一つのことです。

だから、一般的に、私はC#とF#の両方でプログラムすることができていても、私はあなたがより高いレベルで考えることができるので、それが簡単にはF#を使用することを見つけます。小さい方の詳細は、関数型プログラミングから削除されているので、私は、私はより生産的だということを、(F#で少なくとも)それを主張するだろう。

編集:私はあなたが関数型プログラミング言語における「状態」の一例を求めたコメントの一つで見ました。 F#が命令的に書かれたので、ここであなたがF#で変更可能な状態を持つことができる方法の直接的な例だことができます:

let mutable x = 5
for i in 1..10 do
    x <- x + i

あなたが長い時間のデバッグを費やしてきたすべての困難なバグを考えてみます。

さて、どのように多くのこれらのバグのは、プログラムの2つの別個の構成要素間の「意図しない相互作用」によるものでしたか? (ほぼすべてのスレッドのバグは、このフォームを持っている:共有データ、デッドロックを書き込みを含むレース、...さらに、それはグローバルな状態にいくつかの予想外の効果を持っているライブラリを検索、またはレジストリ/環境等を読み出し/書き込みするのが一般的です)< em>の私は/ EMを<>このカテゴリに少なくとも1〜3の「ハードバグ」秋ということを断定します。

あなたはステートレス/不変/純粋なプログラミングに切り替えた場合は、

さて、これらすべてのバグが離れて行きます。あなたが代わりにいくつかの新たな課題が提示されている(例えば、あなたはをするとき行うは異なるモジュールは、環境と相互作用したい)が、Haskellのような言語では、これらの相互作用は、明示的に意味型システム、に具体化されますただ、それはプログラムの残りの部分を持つことができます相互作用の種類についての機能とその理由の種類を見ることができます。

これはIMO「不変」から大きな勝利です。理想的な世界では、我々はすべての設計素晴らしいAPIをしていただきたい事が可変した場合でも、効果は地元と十分に文書化し、「予想外の」相互作用が最小限に抑えられるだろう。現実の世界では、そこに無数の方法でグローバル状態と対話するAPIの多くがあり、これらは最も悪質なバグの源です。ステートレスに志望してコンポーネント間の意図しない/暗黙的/舞台裏の相互作用を排除することを目指すされます。

ステートレスな機能の1つの利点は、関数の戻り値の事前計算やキャッシングを可能にすることです。さらにいくつかのCコンパイラでは、明示的にoptimisabilityを改善するために、ステートレスとしての機能をマークすることができます。多くの人が指摘したように、ステートレス機能は、並列化する方がはるかに簡単です。

しかし、効率が唯一の懸念はありません。純粋な機能は、それが明示的に述べている影響は何も以来のテストとデバッグが容易です。関数型言語でプログラミングする場合と、1は可能な(I / Oなどで)「汚い」など、いくつかの機能を作るのが習慣になります。ステートフルなものを分離するこの方法でもそれほど機能していない言語で、プログラムを設計するための良い方法です。

関数型言語は、「取得」するためにしばらく時間がかかることができ、そしてそれはそのプロセスを経ていない人に説明するのは難しいです。しかし、最終的には十分な長持続ほとんどの人は、彼らが多くの関数型言語を使用して終了していない場合でも、大騒ぎはそれだけの価値があることを実現します。

の状態がなければ、(CPUがより多くのコアで作られていて、これは非常に重要である)は、自動的にあなたのコードを並列化することは非常に簡単です。

私はしばらく前にちょうどこのテーマに関する記事を書いた:純度するの重要性に関するます。

あなたが高いトラフィックを持つ起動時にステートレスWebアプリケーションが不可欠です。

あなたが例えばセキュリティ上の理由から、クライアント側に保存したくないユーザデータの多くがあるかもしれません。この場合、あなたはそれをサーバー側に保存する必要があります。あなたは、Webアプリケーションのデフォルトのセッションを使用することができますが、アプリケーションの複数のインスタンスを持っている場合は、各ユーザーが常に同じインスタンスに向けられていることを確認する必要があります。

ロードバランサは、多くの場合、いくつかは、どのように要求しているサーバーのユーザーを送信するために知っているロードバランサ「スティッキーセッション」を持っている能力を持っています。これは、例えば、それはあなたのWebアプリケーションを再起動するたびに、接続されたすべてのユーザーが自分のセッションを失うことを意味します、しかし理想的ではありません。

より良いアプローチは、データストアのいくつかの並べ替えでは、Webサーバの背後にセッションを保存することで、これらの日本(のRedis、モンゴ、elasticsearch、memcachedの)ために利用可能な素晴らしいのNoSQL製品の負荷があります。この方法は、Webサーバはステートレスですが、あなたはまだ状態のサーバ側を持っており、この状態の可用性は右のデータストアの設定を選択することによって管理することができます。ほとんど常にユーザーに影響を与えることなく、Webアプリケーション、さらにはデータストアに変更を加えることが可能であるべきであるように、これらのデータストアは、通常、偉大な冗長性を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top