web-dev-qa-db-ja.com

機能設計パターン

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

106

私の提案は、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. 型システムを使用して効果範囲を強制する
35
Edmondo1984

これらの構成要素のさまざまな使用法を詳細に説明している記事や書籍を知らないのは残念ですが、個々のリソースへのリンクをいくつか提供できます。

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

Real World Haskellには、モナドに関するいくつかの章があります。 Chapter 14. Monads で、著者は基本といくつかの一般的な使用法(たぶん、リスト、状態)を説明します。 第15章モナドを使用したプログラミング は、それらを効果的に使用する方法についての詳細な説明を提供します(読者モナドについても説明します)。次の章では Parsec の使用方法について説明しますが、実際にどのように機能するかをカバーする記事を検索する方が興味深い場合があります。 Fianlly、 第18章モナド変換器 は、モナド変換器がどのように動作するかを紹介し、それからステップバイステップで構築する方法を示します。この章の最後のセクションに関する考慮事項も興味深いものです。

SO about モナドの創造的な使用法 についての興味深い質問を一度読みました。提案されたリンクは、このトピックに関する素晴らしい読み物でした。 arrows についても同じです。私は間違いなくモナドのものよりも少ない答えを得ましたが、それでも面白いものはありました。


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

  1. 機能的思考:機能的設計パターン、パート1 。ここでは、工場、テンプレートメソッド、戦略、フライウェイトについて説明します。一番下の行は、関数をファーストクラスの値として持つことにより、すべてがはるかに単純になることです。
  2. 機能的思考:機能的デザインパターン、パート2 。これは、約Javaおよび groovy です。アダプターパターンを処理します。
  3. 機能的思考:機能的設計パターン、パート 。ここでは、インタプリタパターンについて説明します。繰り返しますが、ターゲット言語はグルーヴィーです。

最も関連性の高い記事w.r.t.あなたの質問は確かに最初の質問ですが、他の2つは関連する興味深い読書であるかもしれません。

31
Riccardo T.

Jeremy Gibbonsには Patterns in FP blog があります。ちょうど今あなたが望むかもしれないのと同じくらい有用であるが、彼はいくらかの励ましに値する!

一方、私はブレント・ヨージーのTypeclassopediaに対して+1を言います。それは本当に便利ですし、混乱する後の部分がある場合、このサイトはそれらの一番下に到達するのに良い場所です。ブレントがレビューを続けていることは知っています。彼が読者に届かない場合は、彼に助けを与えてください。

18
pigworker

多くのFPスタッフはオレグのサイトで公開されています: http://okmij.org/ftp/

FP Josh Suerethのパターン: http://jsuereth.com/intro-to-fp/ に関するプレゼンテーション

9

Haskellの良さを学ぶ の後の章を読んだことがありますか?

  • 第6章では、関数型言語で最も重要な「デザインパターン」の2つであるマップと折り畳みについて説明します。

  • 第11章から第13章では、ファンクター、適用ファンクター、およびモナドをこの順に説明します。これは便利です。多くのチュートリアルではFunctorを紹介し、次にMonadsを紹介し、最後にApplicative Functorを追加します(まったくカバーしている場合)。 Funyas => Applicative Functors => Monadsから移動すると、次第に一般性と権力の梯子を上っていくので、LYAHの順序はより良いです。

  • 第14章では、Zippersについて説明します。これらは、特定のデータへのポインターを持つコンテナークラスとして効果的に考えることができます。つまり、ポインターの位置でO(1).

Haskellのより高度なトピックであるArrowsやComonadsはカバーしていません。 ArrowsまたはComonadsを使用する方法と理由を理解するには、間違いなくモナドをしっかりと把握する必要があります。したがって、これは問題ではないと思います。LYAHはHaskell市場の初心者向けです。

5
Chris Taylor