命令型プログラマーに宣言型プログラミングを教えようとするとき、いくつかの良い習慣は何ですか?


13

私は自分の会社でF#のトレーニングを少し行うことを申し出ましたが、彼らは興味を示しているようでした。彼らは通常、プログラミングにあまり情熱を傾けないVB6およびC#プログラマーです。そうは言っても、機能的なことを考えると正しいコードを書く方が簡単だと思うので、彼らは間違いなく何らかの利益を得るはずです。

誰も私がこれにどのようにアプローチするべきかについていくつかのアドバイスを提供できますか?

アイデア

  • 構文に集中するのではなく、代わりにこの言語とそれが促進するイディオムをどのように使用できるかに集中してください。
  • 命令的な方法で書くのは苦痛だが、宣言的な方法で書くとエレガントなコードに変換される例を試してみてください。

F#と宣言型プログラミング?????
P Shved

@Pavel-それは質問ですか?
ChaosPandion

3
@Pavel-わかりました、なぜ声明を出したのかを説明してください。非常にあいまいなコメントをしたのはこれが2回目です。とても失礼です。
ChaosPandion

3
en.wikipedia.org/wiki/Declarative_programming関数型プログラミング、宣言型プログラミングの一種です。また、+ 1、良い質問です。
自己への注意

2
@Chaos、私の意見では、F#は宣言型プログラミングパラダイムをサポートしていません。その熱心な評価と命令型の機能により、この言語は、たとえばC#で使用するのと同じ命令型ステートメントを示す便利で機能的な形式にすぎません。さあmake、F#やCamlよりも宣言的な言語ですらあります!(皮肉なことに、これにより仕事が楽になります。)
P Shved

回答:


5

関数型プログラミングは私にとって奇妙な獣です。私はF#とHaskellを学び、いくつかの簡単なプログラムを書いてそれらを使うのが好きでしたが、一部の人々が話す「啓示のフラッシュ」は一度もありませんでした。しかし、ゆっくりと、不変であることを目的としたコードを作成し、タスクをより小さな機能に分割し、デリゲートをより多く使用しようとしていることに気付きました。あなたがそれを好めば、それらのテクニックの価値は自明であるため、あなたの仕事に忍び寄ることです。

今、より実践的にトレーニングのために:私は、2つの概念が本当にスタイルとして関数型プログラミングをクリックしていることに気付きました。

まず、FPスタイルは、OOPのような構成ではなく、データの構造に基づいています。型(文字列)を他の型(リスト)に変換するタイプセーフリストを生成する巧妙なトリックとして、C#のListのようなものを見ました。FPを学んだ後、今はMonadsのようなジェネリックを見ていきます。リストは、コードが取得できる構造化された形式であり、文字列を修飾します。

第二に、おそらくC#/ ASPプログラマーにとってより便利なのは、FPが再帰と繰り返しで動作し、OOPが可変性とループで動作するという考え方です。現在、ASPページのライフサイクルは一種のFPであると考える傾向があります。各リクエストはライフサイクル全体を通してゼロから処理されるため、ページ全体が事実上1つの大きなゆっくりと再帰するプログラムです。その概念を絞り込むことができれば、古いプログラムを変更する代わりに、データを取り込み、それを操作し、新しいデータを返す関数のループの周りに命令型プログラムをどのように構築できるかがよくわかります。

少なくとも私にとって、このアプローチで克服するのが最も難しいハードルは、可変オブジェクトを使用するときに大量のリソースを浪費しているという感覚を沈めれば、大量のメモリを節約できるということです。私たちが信頼しているGCでは、実際にプログラムが実行されているかどうかを確認し、プロファイラーを使用して問題がどこにあるかを確認するまで、パフォーマンスの懸念を取り除くことを学ばなければなりませんでした。



1

多くの命令型プログラミング言語(Ada、C / C ++、Turbo Pascal、FoxPro)には、実行時に評価できる関数(およびプロシージャ名リテラル)のポインタを定義する機能があります。

従来の例は、Cのqsortです。データ構造で他のアルゴリズムを実行するアルゴリズムを定義できるという概念に基づいて構築してください。明らかに、これは関数型プログラミングのほんの一部です。しかし、これは着想を得るための良い出発点であることがわかりました。

それが沈み込んだら、他のこと(不変性、共有なしなど)を掘り下げることができます。


修正:私が言いたいのは、他のアルゴリズムをパラメーターとして取り、それらをデータ構造で実行できるパラメーター化されたアルゴリズムを定義できるという概念に基づいています。
luis.espinal

1

誰も私がこれにどのようにアプローチするべきかについていくつかのアドバイスを提供できますか?

承知しました:

  • F#コードが問題をエレガントに解決するだけでなく、C#/ VBで可能なよりはるかにエレガントに解決できるように、例を慎重に選んでください。ここでは、パターンマッチングと型推論がお友達です。

  • 1つの例を使用して、非同期ワークフロー、アクティブパターンなど、F#の新機能の利点を強調します。

  • 必要に応じて可変データ構造を使用して不純な例を与えることを恐れないでください。F#には理由がありません。

  • F#を万能薬として提示しないでください。F#が適していないアプリケーションと、他の.NET言語よりもはるかに適しているアプリケーションについて説明します。

  • F#を使用した実世界のプロジェクト(Bing AdCenter、Halo 3など)と同様に、彼らが研究できるおもちゃのサンプルを指してください。

  • 問題をより簡単に解決するためにF#がどのように役立つかについて、すべてを説明します。宗教的な議論を避けます。F#については前向きで、他の言語については負ではありません。事実と証拠でそれらを武装させてください、しかし、彼らに彼ら自身の結論を引き出しさせてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.