関数型プログラミングの知識を増やそうとしていると、OOP 言語で解決した問題の解決策を、特にウィジェットが関係する関数に関して再考するのが非常に難しいことに気づきました。Project Euler や 4Clojure などのサイトは、プリミティブ データを操作するためのコア機能とテクニックを学ぶのに最適ですが、私が本当に欲しいのは、いつ、どのように使用するかを特定することに特に注意を払いながら、OOP 構造を慣用的に FP に変換する方法について説明しているリソースです。州。(具体的な例を挙げると、Clojure でピアノの鍵盤を実装する最良の方法は何ですか?)
4 に答える
私が本当に欲しいのは、慣用的に OOP 構造を FP に変換する方法を説明するリソースです。
しないでください。これは古典的なXY 問題です。
私は類推は嫌いますが、エンジニアリングの同等物は、金属加工をマスターし、プラスチックで同じ形状を再現することによってプラスチックを学びたいと言うことかもしれません. 実際には、自分が知っていることを自分が学んでいることに翻訳したいとは決して思いません。あなたが本当にやりたいことは、新しいテクニックを使って慣れ親しんだ問題を解決する方法を学ぶことです. エンジニアリングの話に戻ると、優れたプラスチック デザインは、優れた金属デザインと同じ形状ではありません。プログラミングに関しては、あるパラダイムを使用して構築されたソリューションが別のパラダイムにうまく変換されることはありません。問題を最初から再解決する必要があります。
私は役立つかもしれない2冊の本を知っています:
Brian Marick による「オブジェクト指向プログラマーのための関数型プログラミング」 。
Chas Emerick、Brian Carper、Chirstophe Grand による「Clojure プログラミング」 。第12章では、オブジェクト指向の設計パターンをClojureに「変換」する方法について説明しています。
私は、OOP 構造を関数構造に変換する方法を教えてくれる本を知りません。少し時間を割けば、機能的な慣用句を理解できるようになります。
OOP コードと FP コードをマッピングしようとしないでください。言語(話し言葉)を学ぶ最善の方法は、それに没頭して考えることです。プログラミング言語も同様です。
Clojure を学び始めたのは 3 年前のことです。当時の私は、Lisp とは何か、関数型プログラミング言語とは何かさえ知りませんでした。私は言った:え?本当にそれは何ですか?Lispで何か役に立つことはできますか? 私はたくさん読み、たくさん勉強し、さらに良いことに、Clojure で仕事を得ました!
今では、関数型言語でのプログラミングは私にとって自然に感じられ、理にかなっています。データ構造と関数のプログラミングは、私が必要としているものすべてです。シンプル!
関数型プログラミング言語はデフォルトでは難しくなく、OOP 言語はデフォルトでは簡単ではないことに注意してください。
私はこの本を読んだことはありませんが、あなたが探しているものにはかなり合っているように思えます (私が読んだ他の Pragmatic Bookshelf の本にはとても満足しています)。
Scala と Clojure の関数型プログラミング パターン
宣伝文句から:
静的に型付けされ、型が推論される Scala と、動的に型付けされる最新の Lisp Clojure の両方を使用することで、関数型プログラミングについて幅広い理解を得ることができます。パターンごとに、最初に従来のオブジェクト指向ソリューションを確認し、次に Scala と Clojure の両方での機能の置き換えについて掘り下げます。
Re: ピアノに関する質問です。core.async と、core.async を使用した UI デザインに関する David Nolen のブログ投稿 (特にhttp://swannodette.github.io/2013/07/31/extracting-processes/ ) が興味深いかもしれません。
ブログ投稿で、彼はユーザー インターフェイス (ひいてはピアノ) が、イベント ストリーム処理、イベント ストリーム調整、およびインターフェイス表現の 3 つの要素で構成されることを提案しています。そして彼は、これらが典型的な OOP Model View Controller よりもはるかに強力な抽象化であることを示しています。ただし、すべてかなり新しいものです (core.async はまだ正式にリリースされていないと思います)。しかし、ピアノをモデル化するための慣用的な Clojure の方法を探しているなら、それはおそらくそれらの線に沿っていると思います...