web-dev-qa-db-ja.com

命令型言語に関して、純粋に関数型言語でのモナドの実装の違いは何ですか?

長い間、これらの Monad 構造の使用は非常に小さな言語の輪に制限されており、それらの多くは純粋に関数型です(主にIOの管理に関連する問題のため)。
最近、これらの構造は命令型言語にも適応されています

私の質問は次のとおりです。私たちは同じデザインパターン、モナドについて話しますが、違いは何ですか実装内純粋に関数型言語のモナドに関して =同じ設計パターンですが、命令型プログラミングに実装されていますか?

どのような変更ですか?確かにアイデアは変更しませんが、同じデザインパターンの実装について話しているが、2つの異なるプログラミングパラダイムについて何かが異なる必要がある場合、おそらく同じ情報が返されますが、同じアイデアを使用していますが、2つの異なるパラダイムコンテキストで- 副作用 同じにすることはできません。そうでなければ、命令型言語のモナドを実装することはできなかったでしょう。

1
Ansgar Wiechers

私が考えることができる主なことは、例えばHaskell Monadはライブラリ内の型クラスとしてキャプチャできるため、単なるデザインパターンである必要はありません。これは、モナドで関数を一度に記述できることも意味します。 http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad.html が存在し、その中の関数はモナドのタイプごとに書き直す必要はありません

1
jk.

命令型モナドはオブジェクトです

オブジェクトの関数が呼び出されるたびに、その表現が更新されるため、次の関数呼び出しの応答が異なる可能性があります。

あなたが探している違いは、そのオブジェクトがその状態を維持する方法にあります。

  • 機能スタイルオブジェクトは、追加専用の内部表現を維持します。
  • 命令型スタイルのオブジェクトは、変更可能なデータ構造を維持します。

データ構造のみを追加

追加のみのデータ構造の大きな利点は、トランザクションをサポートし、すぐにデータを共有できることです。読み取り専用操作の場合、これは無料の昼食です。データは変更されないため、複数のスレッドが同期を必要とせずに同じバージョンのデータを読み取ることができます。

変更に関心のある唯一の個人がライター自身である限り、ライターにとってもこれは問題ありません。各作家は、共通の過去を共有するだけで、独自の方向に構造を成長させるだけです。これらの更新を共有する必要がある場合は、更新をシリアル化して検証し、新しいバージョンへの参照を公開するための同期メカニズムが必要になります。

これらの追加のみの構造には欠点があり、それらのメモリはアクティブな負荷の下で解放されません。スレートがきれいに拭き取られる時点がない場合、これは大規模なメモリリークにつながります。データベースエンジンはこの問題に悩まされており、エンジンが再び読み込まれることのないメモリを解放できるように、誰がどのバージョンを使用しているかを監視するために多大な時間を費やしています。

相互データ構造

逆に、命令型スタイルオブジェクトには、正反対の利点があります。それらは1つのスレッドでのみ安全に使用でき(非常に注意深い設計が使用されない限り)、これらは歴史的に記憶喪失であり、コーディングエラーを除いて、消費するメモリを厳しく制限します。

これにより、次のような状況に適しています。

  • メモリが制限されています、
  • 共有されることはめったにありませんが、
  • 状態が必要になる瞬間まで
0
Kain0_0