6

私は最近、モナドやモノイドなど、関数型プログラミングのさまざまな側面に役立つリソースについてこの投稿に出くわしました。

しかし、問題は、平均的なプログラマーがそのような概念からどのような用途を利用できるかということです。私はしばしばそれらの問題についての「学術的」研究に出くわします。しかし、実際に(実際のプロジェクトで)それらを使用している人に会ったことはありません。

だから問題は-Haskellで実際にそのようなものを利用する広く使われているオープンソースプロジェクトはありますか?そのようなプロジェクトは、「アカデミック」ソフトウェアではなく、「プロダクション」ソフトウェアでこの概念の実際の必要性を示しています。ただ楽しみのために」。次のようなリストを作成するのはクールです。

  • モナド-AやBのようなプロジェクトで使用されます。そうしないと、そのようなコードははるかに複雑に見えるためです。
  • モノイドについても同じです。
  • ファンクターについても同じです。
  • 矢印についても同じです。
4

3 に答える 3

9

これらの概念の多くはHaskellコードでは非常に暗黙的であるため、それらを使用しない例をリストする方が簡単です(見つけられると仮定します)。すべてのHaskellプログラムは、少なくともIOにはモナドを使用します。

これらはすべて、コードに非常に頻繁に現れる抽象化であるため、広く使用されています。ファンクターについて考えてみましょう。コンテナーへのマッピングはかなり一般的なニーズであるため、コンテナーのようなデータ構造に対して単一のインターフェースを使用することは理にかなっています。これはまさにファンクターが提供するものです。「コンテナ」の概念でさえ、ファンクターの抽象化よりも具体的であることが起こりますが、うまくいけば、これがポイントを示しています。

モナド:XMonadウィンドウマネージャーは、モナド変換子とジッパー構造を多用する広く使用されているプログラムです。 STMは、有用なプロパティを備えた新しいモナドを提供するライブラリです。

モノイド:パッケージSequence内の構造はモノイドで実装されます。また、2つのモノイド操作は空のリストと連結(または空のセットと和集合)を提供するため、モノイドはセットやリストなどのモデル化に広く使用されています。containers

矢印:YampaHXT(Haskell XML Toolbox)がすぐに思い浮かびます。

ファンクターはいたるところに現れます。モナディックコードに多くのが含まれることはかなり一般的です。これは、インスタンスが使用中で <$>あることを意味します。ほとんどのHaskellパーサーはファンクターを多用します。Functor

于 2011-11-28T13:34:43.843 に答える
6

エルテスの答えとジョンLの答えは素晴らしいです。ファンクターとモノイドについて何かを付け加えたいと思います。Haskellの用語の多くは、その精度には優れていますが、新しいHaskellプログラマーには少し不快感を与える可能性があると思います。私はいつも、モノイドは「アペンダブル」と見なすことができ、ファンクターは「マップ可能」と考えることができると新参者に言います。明らかに、この同化にはいくらかの損失がありますが、それは言語の最初の語彙のハードルを乗り越えるのに役立ちます。モノイドインターフェース(タイプクラス)には「追加」関数と「恒等」関数がありますが、ファンクターはマップ関数を指定するだけです。追加とマッピングの長年のアイデアの間には多少のずれがありますが(たとえば、合計は一種の追加です)、基本的なアイデアは成り立ちます。

追加とマッピングのための単純なインターフェースと見なすと、モノイドとファンクターはすぐに多くの用途があることを明らかにします。データ構造が追加またはマッピングをサポートする必要があるときはいつでも、データ構造をモノイドまたはファンクターのインスタンスにすることで簡素化できる時間があります。プロセス。

お役に立てば幸いです。

後で、ここにあなたが尋ねていたライブラリのリストがあります。

ファンクター:attparsecのような構文解析ライブラリを見てください。http://hackage.haskell.org/package/attoparsec-0.10.0.2ファンクターを使用すると、パーサーを簡単に作成できるため、複雑なデータでも、作成しやすく、読みやすいパーサーを作成できます。attoparsecパーサーを同等の正規表現と比較してください!

モノイド:任意の配列、ベクトルライブラリ(http://hackage.haskell.org/packages/archive/vector/0.9/doc/html/Data-Vector.html)を調べて、モノイドの追加機能を実装するためのモノイドの使用法を確認します。 。また、これはモノイドを機能させるための優れた記事ですhttp://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html

モナド:モナドの完璧なユースケースについては、Data.Binary(シンプルで基本的なHaskellライブラリ)をご覧ください。http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.htmlモナドを使用すると、バイナリファイルをほぼ必須の方法で解析するための複雑な一連の命令を記述できます。 。

于 2011-11-28T13:45:28.857 に答える
6

私は実際のアプリケーションに生産的に矢印とモナド(したがってファンクターも)を使用しています。私の関数型リアクティブプログラミング(FRP)ライブラリNetwireは、あなたが言及した4つの概念すべてとそれ以上を組み合わせたものであり、FRP自体もデザインパターンであり、通常、学者から知っています。使用される概念は次のとおりです。

  • 矢印と矢印トランスフォーマー:NetwireはWire、矢印トランスフォーマーであるタイプを提供します。
  • モナドとモナド変換子:通常、矢印Wireで囲まれたモナド変換子のスタックに変換されます。Kleisli
  • ワイヤー抑制(例外や発生していないイベントなど)はモノイドを使用します。

バージョン3がリリースされようとしています(今日は願っています)。これにより、(関連付けられていない)型族もゲームに登場します。

于 2011-11-28T12:09:29.747 に答える