機能的なデザインパターン[終了]


106

モナド、アプリケーション、矢印など、機能的なイディオムはたくさんあります。それらはさまざまな記事に記載されていますが、残念ながら、それらが1か所にまとめられている本や記事はありません(Typeclassopediaがありますが、たくさんあります十分にカバーされていない領域の)。誰かが1か所で十分にカバーし、FPの中間スキルを持つプログラマーがアクセスできる記事/本を推薦できますか?


:それは直接あなたの質問に答えていないが、この他の質問には、いくつかの興味深い情報(少なくともリンクまたは2)を持つstackoverflow.com/questions/327955/...
ルーベン

15
Typeclassopediaがうまくカバーしていないと感じている領域を拡大していただけますか?
dave4420

2
@ dave4420 typeclassopediaを最初から最後まで読むと、読むほど読めなくなります。最初のセクションは本当に良いですが、後のセクションは私にはほとんど読めません。
Konstantin Solomatov

3
@KonstantinSolomatovそれはあなたが理解していないセクションを調査し、ブログの投稿を見て、そしてコードを一生懸命に見る必要があるかもしれません。typeclassopediaのこれらの「デザインパターン」はすべて、実際には抽象化であり、多くの場合は深いものであり、時として陥るまでに時間がかかります。
jberryman

1
@DanBurtonは、私のコメントを誤って読んだかどうかはわかりませんが、それらすべてを深い抽象化として分類しますが、「ああはっ!」瞬間。
jberryman 2012

回答:


35

私の提案は、Scalaを学びたい場合は、Paul ChiusanoとRunar Bjarnasonの本を読むことです。

http://manning.com/bjarnason/

パートII:機能設計およびコンビネーターライブラリ

  1. 少し言語を作る
  2. JSONシリアル化
  3. 仕様ベースのテスト
  4. パーサー
  5. 純粋に機能的な並列処理
  6. 純粋に機能的な状態

パートIII:機能設計パターン

  1. 抽象化の理由
  2. モノイド
  3. ファンクター
  4. モナド
  5. 応用ファンクタ
  6. 走査および折りたたみ可能なデータ構造
  7. コモナード

パートIV:ルールを破る:効果とI / O

  1. 効果と副作用
  2. ストリーム処理とインクリメンタルI / O
  3. 型システムによる効果範囲の強制

31

申し訳ありませんが、これらの構成要素のさまざまな使用法について詳しく説明している記事や本はありませんが、個々のリソースへのリンクをいくつか紹介します。

非常に一般的なパターンは、単純なモナドの代わりにモナド変換子を構築することです(次の段落のリンクも参照)。それは基本的に、他のモナドと組み合わせる必要がある何かを構築することを意味し、その結果、両方のモナドを処理できるより複雑なモナドになります。

では実世界Haskellのモナドについていくつかの章があります。では第14章モナドの著者は、基本といくつかの一般的な使用法(多分、リスト、状態)を説明します。第15章モナド使ったプログラミングでは、それらを効果的に使用する方法についてさらに説明します(リーダーモナドもカバーしています)。次の章ではParsecの使用方法を説明しますが、実際にどのように機能するかをカバーする記事を検索する方が興味深いかもしれません。これは、解析のためのモナドのよく組織化された使用の本当に良い例になるはずです。Fianlly、第18章。モナド変換子モナドトランスフォーマーがどのように機能するかを紹介し、1つずつ構築する方法を段階的に示します。この章の最後のセクションに対する考慮事項も興味深いものです。

は、モナドの独創的な使用法について、SOに関する非常に興味深い質問を一度読みました。提案されたリンクは、トピックについての素晴らしい読み物でした。その精神で、私は矢に同じことを尋ねようとしました:私は確かにモナドのそれよりも少ない答えを得ましたが、それにもかかわらず興味深いものはありました。


4人のギャングによるOOPパターンに関しては、IBMによる、機能的思考シリーズのトピックに関する3つの記事の素晴らしいセットがあります。ターゲットの関数型言語はScalaです。OOPでの通常の設計パターンを説明し、それらがScalaにどのようにマッピングされるかを示します。

  1. 関数型の考え方:関数型の設計パターン、パート1。ここでは、工場、テンプレートメソッド、戦略、フライウェイトについて説明します。肝心な点は、ファーストクラスの値として関数を使用することで、すべてがはるかに簡単になるということです。
  2. 関数型の考え方:関数型の設計パターン、パート2。これはjavaとgroovyに関するものです。アダプターパターンに対応しています。
  3. 関数型の考え方:関数型の設計パターン、パート3。ここで彼らはインタプリタパターンについて話します。繰り返しますが、ターゲット言語はグルーヴィーです。

あなたの質問に最も関連する記事は確かに最初のものですが、それでも他の2つは興味深い関連する読み物かもしれません。


ありがとう。でもモナド、アロー、Applicative no GoFパターンなど、さまざまな種類のパターンを意味します。
Konstantin Solomatov

@KonstantinSolomatov:ごめんなさい、あなたの質問を誤解しました。モナドと矢印のリファレンスをいくつか追加しました。
リカルドT.

18

ジェレミー・ギボンズには、FPブログにパターンがあり、最終的には、あなたが求めている本にかなり近いものになる予定です。もちろん、それはあなたが今望むほど有用な状態にはまだなっていませんが、彼はいくつかの励ましに値します!

その間、Brent YorgeyのTypeclassopediaの場合は+1とします。それは本当に便利で、後で混乱する部分がある場合、このサイトはそれらの底に到達するための良い場所です。ブレントがレビューを続けていることは知っています。彼が読者に届いていない場合は、彼に助けを求めてください。



5

Learn You a Haskell for Great Goodの後の章を読みましたか?

  • 第6章では、関数型言語で最も重要な「設計パターン」の2つであるマップとフォールドについて説明します。

  • 第11章から第13章では、ファンクタ、アプリケーションファンクタ、モナドの順に説明しています。これは役に立ちます。多くのチュートリアルではFunctorsを紹介し、次にMonadsを紹介して、最後にApplicative Functorsを追加します(まったくカバーしている場合)。Functors => Applicative Functors => Monadsから移動すると、次第に一般性とパワーのはしごが上に移動するため、LYAHの順序はより適切です。

  • 第14章では、ジッパーについて説明します。これらを効果的に特定のデータへのポインターを含むコンテナークラスと考えることができます。つまり、ポインターの場所でO(1)アクセスと更新を取得できます。

Haskellのより高度なトピックであるArrowsまたはComonadsについては説明しません。ArrowsやComonadsの使い方と理由を理解するには、モナドをしっかりと把握している必要があるので、これは問題ではないと思います。


1
はい、本を読みました。とても気に入りました。残念ながら、それは矢や他の多くの高度なパターンを隠していません。また、モナドとApplicativesについてもっと読みたいと思います(たとえば、LYHGGは継続モナドをカバーしていません)。
Konstantin Solomatov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.