開発環境への関数型プログラミングの導入[終了]


15

これは長い話ですが、できる限りベストを尽くして要約します。私たちは、さまざまな種類の資金のためのソフトウェアを書く.NETショップです。たとえば、健康保険金請求管理ソフトウェア、年金管理ソフトウェア、401(k)ソフトウェア、およびその他の金融タイプのものを作成します。

今、私たちは新しい領域に入ります:デリバティブと定量分析タイプの仕事です。これは、私が言われた次の8〜12か月で落ちてくるものです。

今、私は自分自身でいくつかの関数型プログラミングを学びました。主に、この本を通してさまざまな言語の表面的な目線を見ただけですが、深く掘り下げたことはありません。今、私たちは.NETショップなので、F#が良い選択だと思っていました。なぜなら、.NETライブラリと既存の知識を潜在的に活用できるからです。

私の質問は、どこから始めればいいですか?Haskell、Erlang、Scala、F#などと一緒に行くべきかどうかを判断しようとするのは非常に困難です。これらはすべて非常に興味深く、能力があるように見えます。

誰も同じような状況がありましたか?そうだとすれば、機能性へのジャンプを行った経験は何でしたか?私はこれが一種の大きな質問であることを知っていますが、現在関数型のメソッドを使用している開発者は知りませんので、グーグルを絶えず変え、最高の関数型言語のどこでも炎の戦争を見つけること以外に私は他にどこにもありません。


読書推奨:どこから始めれば
ブヨ

回答:


14

プロトタイプ、プロトタイプ、プロトタイプ!関数型プログラミングが必要だと思われるビジネス機能を少し取って、さまざまな言語を試してみて、探している利点と相互運用性が本当に得られるかどうかを確認してください。


良いアドバイスであり、私はそれを心に留めます。実際、私はそれを試してみるために今すぐErlangをインストールしています。
ノードノーノードガイ

10

正直に答える必要がある最初の質問は、関数型言語の使用を検討している理由です。切り替えのビジネス上の理由を正当化できない場合、それを行うべきではありません。言い換えれば、新しいフレームワーク、言語、またはその他の新しいテクノロジーを作業環境に導入したいのは、それを学びたいという理由だけでなく、次の「クールな」ことは間違いだと思われるからです。ですから、最初にモチベーションが何であるかを正直に自問する必要があります。

特定の問題を解決するために関数型言語が本当に必要だと感じ、主流の関数型言語のほとんどが要件を満たしていると仮定した場合、最も成熟したものと最大のユーザーコミュニティを持つものを選択します。Erlangは適切な選択であり、これらの要件の両方を満たしますが、純粋にms / .NET環境では、F#の使用を理解できます。


2
@ennukiller-関数型プログラミングが私たちにとって良い選択であることは間違いなくわかります。嘘をつくつもりはありません-それが提供する純粋な知的刺激のためだけにそれを使いたいです。私たちは大量の計算を行うつもりであり、マルチコアを活用したいと思います。また、すべての数学関数が正しいことを証明することが不可欠です。関数型の方が簡単かもしれません。
ノードノーノードガイ

2
証明が必要な場合は、純粋な関数型プログラミングが最適です。ここでのいくつかの提案は、命令型言語への機能的なアドオンに関するものです-それらはより親しみがあるかもしれませんが、証明できるほど正しいコードを提供しません。副作用がある場合、x = x(「参照透過性」)という事実を使用することはできません。また、コードの後半のxが以前と同じ値を保持していることを証明する必要があります。一部の言語では、例えば、その発生する可能性がx:=3; y:=10; x:=add(x,x);で結果x6されていないとy、この状況は非現実的であるにあなたの関数が修正証明するために10ではありません。
AndrewC

9

既存のJavaコードベースを使用するショップのScalaに強く同意するように、既存の.Netコードベースを使用するショップのF#に強く同意します。

関数型プログラミングは、他のツールと同様のツールです。うまく使用され、すでにコードを開発している方法と統合されているため、コードが何をしているのかを推論しやすくなり、生産性が向上します。ただし、言語の切り替えは無料とはほど遠いので、最善の策は、既存のコードをできるだけ長く移行に使用できるソリューションです。結局のところ、環境に新しい言語を導入しない最も確実な方法は、この時点で変更の利点を確認するために、これまでのすべてを書き直さなければならないことを同僚に伝えることです。あなたはまだそれらを販売しようとしています。


7

新しい言語をすぐに学習せずに関数型プログラミング開始することをお勧めします。また、新しい言語の構文を理解しようとしているときに、新しいパラダイムを学習しようとすると、さらに難しくなります。

もちろん、関数型プログラミングを行うために特別に開発された言語にはいくつかの利点があります(理解などの特定の構造を持ち、デフォルトでデータ構造を不変にするなど)が、一般的に行う最大のステップは関数型に考えを変えることですスタイル。C#はそれを行うのに最適です。

基本的に、コードの状態の変更を停止するだけです。Javaを使用してこれを実行しましたが、ラムダがあるため、C#を使用するとさらに簡単になります。そのスタイルに慣れて、それが何に適しているのかという感覚をつかめば、関数型言語(F#を選択するか、Erlangかに関係なく)を簡単に選択して、非常に生産的になるでしょう。


1
+1:賛成です。また、JavaとC ++でより機能的なスタイルでコーディングを開始しました(より多くのfinal変数とconst変数を使用し、関数構成を使用して複雑な操作を分割するなど)。これにより、JavaとC ++でのプログラミングスタイルが確実に改善されたと思います。1はさらに行くために準備ができて感じているときしばらくして、一つは関数型言語(などハスケル、OCamlで、SML、Lispの、スカラ座、F#の)試してみることができます
ジョルジオ

1

関数型プログラミングの学習と理解だけが必要な場合は、IronPythonをインストールして、Pythonの関数型機能に注目してください。最悪の場合、C#と統合してアプリケーションのコード行数を削減し、バグのない製品を予定より早く提供できるツールを学習します。

Pythonの機能的アプローチが複雑なものを単純化する方法の例については、ジェネレーターに関するDaBeazのプレゼンテーションをご覧ください。http: //www.dabeaz.com/generators/

それ以外は、Scalaに時間をかけるのが賢明だと思います。これは.NETでベータモードで実行されるため、インストールして学習目的で使用することができ、秋には.NETのリリースモードになります。これは、JVMおよび.NET全体で移植可能なコードをScalaで作成できることを意味します。また、Scalaはアクターとメッセージパッシングに基づいているため、複数の個別のマシンで実行される複数の個別のプログラムで作成されたアプリケーションを非常に簡単に構築できます。.NET / JVMポータビリティをミックスに追加する場合、考慮すべき別の側面があります。プロトコルを開発して通信を行わなくても、サードパーティのJavaライブラリとサードパーティの.NETライブラリの両方を活用する1つのアプリケーションを作成できます。両方のプロセスはScalaで記述され、また、Scalaリモートメッセージング(リモートアクター)を使用して通信します。Typesafe.comが行っていることから判断すると、最終的にScalaの標準ライブラリの一部になると思われるAkkaライブラリをチェックしてください。


+1:Scalaとその異なるプラットフォームでの可用性について言及します。質問:akkaはScalaの現在のアクター実装に取って代わりますか?それとも、2つが並んで存在しますか?
ジョルジオ

Akkaが現在のScalaアクターをすぐに置き換えるかどうかはわかりませんが、Scalaの作成者であるMartin OderskyはTypesafeのAkkaの作成者であるJonas Bonerに加わりました。彼らはAkkaでScalaを大きく宣伝しており、現在はPlayフレームワークで宣伝しています。したがって、開発の焦点はAkkaにある可能性があります。Scalaで俳優を学んでいるだけなら、最初にAkkaに集中するのが最善でしょう。
マイケルディロン

情報をありがとうございました!私はScalaのアクターを調べましたが、これまでは非常に表面的なものだけでした。
ジョルジオ

-1

私は確かに受け入れられた答えの主な推力に同意し、Erlangを試して基本的に物事に飛び込んでいることを考えると、あなたはおそらくあなたが学ぶ方法をかなりよく理解していて、右に少しだけ必要なだけのように聞こえます方向なので、明らかにそれはあなたにとって良い答えでした...しかし、この答えは私にはまったく役に立たなかったと思うので、私は少し違った質問にアプローチすると思います。私はいつも学ぶためにコーディングしています!だから、ここに私の考えがあります...

(ところで、たとえば本の章にもっと適した詳細に進む傾向があり、本能をここで完全に抑えることはできないと確信していますが、私は別のタックを試してみるつもりです;ここで私の考えを要約し、誰かが何かについてもっと詳しく知りたい場合、またはこの形式で私が言うことが誤解を招くと思う場合は、応答リマインダーを忘れずに忘れないように最善を尽くします...)

自分が仕事を続けられるようにするために、OPで求められた推力の質問に対する私の理解をここに示します。説明のために必要に応じて副業を最小限に抑えます。

最初の簡単な答え:

私は同じような状況にありましたか?少なくとも似ていました。私は主導的な立場にありましたが、それでも関連する多くのさまざまなプロジェクトを行っていました...(CRM / Web / DB / Data Integration / etc。)

なぜ/どのように機能するようになったのですか?」 LINQの例をいくつか見ましたが、ある種の統合された静的に型付けされたクエリ言語(主に静的に型付けされた言語(主にC ++以降のC# )]私のキャリアを通して...しかし、それは私がいたかなり速い火の環境でした、そして、私はしばしば過去に何が来るかを見ることができましたが、私はそれを本当に考えなかったので、それを予見しませんでしたプレーンオールドオブジェクトの操作を許可する/許可する(笑!)私はそれを見たとき、私はそれを持たなければならないことを知っていました...だから、それが理由であり、方法の始まりです:私はLINQを理解することを学ぶことに集中しました。

四つの考え...えー、いや、そうではない...

Martijn Verburgの答えを読んだとき、ビジネス機能についての言及は、私が取り組んでいるものにコードを実装し始めることにすぐに心を惹きます...あなたの足の親指を浸して、仕事(または近々仕事になる)のために直接何かを持っているかどうかはわかりませんが、おそらくあなたが取り組む最初のいくつかの問題についてあなたが持つべき興奮/情熱を与えるでしょう...

私はほぼ完全に静的に型付けされた言語+ OOPのメタファーとパターン+何年にもわたって実際の問題を解決している間に偶然に脳を包み込んでしまったものに根ざしていました。おそらく、LINQ / FPでそれほど役に立たないものに専念する多くの頭脳を持っているでしょう。

あなたはOOPで使用して終了することを手続多くのものがありますが、それにも優先することなく、CからC ++に来る人たち:私はちょっと純粋な手続き対のオブジェクト指向プログラミングのようにそれを考える「取得」/ GROK /県 OO C ++が非常に苦手です。私は実際に、C ++を知っていると本当に思っていたが、せいぜい C ++のひどく基本的な/教科書を理解していた、多くの(15歳以上の)長年のファームウェアおよびデバイスドライバーの開発者にインタビューしました。OOPの経験-実際にOOPを実行したことはないため...静的メンバーと静的関数を使用して、構造体として使用される非静的/非単一クラスのシングルトン多目的クラスを作成しました。

そしてFPには、同様の心を曲げる(パラダイムで育てられていない人のための)概念やそれに付随する他の事柄があります(多くのテクニックのハイブリッド化が私にとって理想的であることがわかりましたが)時間がたつにつれて、本当の機能的能力をツールセットに取り入れる前に、私の思考がどれほど制限されたかが正確になりました。私は過去に多くのオブジェクト指向プログラマーよりも少し創造的だった方法で多くのことを実装することができましたが、概念を使用するとき、私の思考が以前はいかに難しかったか...解決できる問題の全クラスがありますかつてはC ++ / C#で多くのゆがみをしていました。

突然あなたは自分自身を見つける...

「長すぎる」投稿で

あなたは曲がりくねった「読まなかった」迷路の中にいます。

近い将来、電話会議が急速に近づいています。
>簡潔
うん。承知しました。さて、「簡潔」モードは「オン」です。

近い将来、電話会議が急速に近づいています。
>それはどういう意味ですか?
言ってるだけ'。今朝何かする必要はありませんでしたか?

近い将来、電話会議が急速に近づいています。 
>ねえ、それはあなたの背後にあるグルーですか?
何!?どこ?![叫びながら逃げる]

>申し訳ありませんが、私はどこを理解していませんでしたか?
[走り続け、叫び続け、皮肉は気づかれない]

それで... PSEの皆さん、PSEの皆さん、何を学ぶべきでしょうか?

私は個人的にLINQでC#を始めました。一度にいくつかの概念を紹介することができました。FPとその概念、さらにLINQ、および2つの関係について常に読んでいるうちに、生産的な作業をしながら前進できました。私は一度にいくつかのことを追加しました。データクエリは、トンを理解する必要なく、すぐに便利なツールになりました。

さて、振り返ってみると、次のプロジェクト(約1年後に取り組む)を最初にできたらよかったと思います。私はF#にある程度慣れました(偶然、ML(メタ言語)と他の派生物(たとえばOCamlを学ぶ上で素晴らしいスタートを切ってくれました)

基本的に、「何」に対する適切な答えは、あなたが興味を持っているプログラミング問題の良い組み合わせを見つけることに依存すると思いますが、もちろんあなたが学びたいFPのビットとペアにする必要があります...リストから何かをノックした後、繰り返し/泡立てます...)そして、もちろん、あなたはいつもあなたがすることを目指した主なことよりもう少し多くを学ぶことになります。最初はいくつかの小さなステップを踏んでいましたが、それから大きなことをして、小さなものを所定の位置に収めるようにしました。

まず、あなたのボートは何に浮いていますか?特に最初は、(あなたにとって)楽しくてエキサイティングなものを用意することが最善であり、それはあなたにとって興味を持ち続け、あなたにとって価値があるものになります。ですから、IOWが取り組むべき問題と、それらの問題に対処するテクニック... LINQとインラインデータクエリを最初に私のために。再帰は、尾の再帰を含む私にとっては別のものでした。GodelEscherBach-nessを掘ります。そして、私はテール再帰について読んでいました。この頃、私が取り組んでいたものは保留にされ、長い時間を費やしてしまいましたので、私はそれを長い間維持することができました。中断が少ない方が簡単でしたが、楽しいと思ったものを選んだため、作業が中断されてもそれほど難しくはありませんでした。:)

そして、私はクールなものを思いつきませんでしたが、自己認識のカニプログラムのように話すことができますが、私はそれでかなりうまくいくことができました。

そして... PSE、PSE、何で、何を学べばいいの?

このために、とにかく興味を起こしたさまざまなアルゴリズムに加えて、F#でできるかどうか疑問に思ったさまざまなことを使用し、アイデアがなくなったら99本のビールProject Euler問題 ...

FPに関連する興味のあるものをたくさん見つけることができると確信しています。拡張機能からOOPまでのすべてを提供します。これにより、以前よりも簡潔に表現できるようになります。前。

しかし...私のモデルに穴があります、親愛なるPSE穴...

そして、これが、特に最初は重要ですが、実際に学習している間(そして何かを学習しているときは常にそうではありませんか?) FPと専門家によって書かれたソースコードを読む時間、できれば同じまたは類似の問題を解決する。物事の説明だけでなく...

そしてその間、あなたはあなたの古い視点からではなく、FP自体から、それをすべて理解するためにあなたの脳に負担をかけなければなりません...私のためのある時点で、それはクリックし、...私がそれを最もよく関連付けることができることtoは多かれ少なかれオランダ語に堪能になっています。ある時点で、私は自分自身を十分にマインドセットに入れることができました(これは基本的にここで説明した没入感を使って行いました。

そして、最終的に私はしました。私はすべてを内部化して、FP / LINQをポップし始めるまで頭をひねりました。(はい、私はそれをしました;私はスカートを掛けるために何かを持っていなければなりませんでした。帽子。何でも。)

最終的な考え...

私、私の、あなたはあなたの署名の賢いことを考える能力を失っているようです
セクションのタイトル。残念だ。

電話会議はまだ急速に近づいています。今ではずっと大きく見えます。
>はい、はい、まあ..簡潔ですべて。私はあなたがなんとかそのgrみを失ったのを見ます。
 近い呼び出し、それ...まあ、はい、私はterしています... OHいいえ、戻ってきました!
AAAAAAAHHHHHH !! [もう一度叫びながら逃げる]

電話会議はまだ急速に近づいています。
それはどういうわけか、ランシージョン・クリーズウィズirに似ています。
もうすぐです。
>ちょっと、急いで!私はあなたと一緒に試す実験をしています!(およびpo-ta-to)

もちろん、FPに関する豊富な情報をオンラインで見つけることができます。主なことは、基本的な概念を理解し、それらを適用することを学ぶことです。たとえば、不変性、およびそれがFPにとって重要/有用である理由について学びます。純粋なFPが形式的証明をはるかに受け入れることができるように、すべてと一緒に進むために少し理論を学ぶことを強くお勧めします。これは、F#の先駆者であるMLの背後にある推進力でした。もちろん、YMMVあなたは正確に確認する場合は涙に退屈誰か、多くの例、試行錯誤がたくさんあることも理由に使用される技術は、彼らはあなたが持っていることを助けるれているものである「アハを!」ひらめいた。

それで、私は今のところそれを残します。これが誰かの役に立つことを願っています。学ぶために具体的なことをもう少し知りたいと思っていましたが、今のところ時間がありません。私にとっては長い週になりそうですが、少なくとも週末になると思いますが、すぐに戻ってくる時間を見つけられることを願っています。

<3「暫定的なGRUEBOLの紹介。SnozzMLが終了するまで。間もなくそうなるはずです。今回は私を支援する巨大な委員会があります。」--Grace Hopperwit Egghead、有名な最後の言葉、XX97 GUE <3


「親愛なる」とは何ですか?
-gnat

親愛なるスタックオーバーフローでした。「バケツに穴が
開いている

SOの外側を投稿する場合、これはあなたのポイントが難しく理解するために作るように見える-考える編集そのためにアカウントにする
ブヨ

derp!はい、そうです。tyvm。:)
shelleybutterfly 14

誰かが私の答えを改善する方法について提案がある場合、私はそれを感謝します..それは悪いユーモアでしたか?または悪いアドバイス?実際には私の経験に基づいているので、もっと便利にできるように変更できたらうれしいです。ありがとう;)
shelleybutterfly 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.