「作曲しない」の意味は何ですか?


35

多くのテキスト、特に関数型プログラミングテキストは、特定のCSの概念が「構成しない」と主張しています。例は次のとおりです。ロックは作成されません、モナドは作成されません。

私はこのフレーズの意味を正確に追跡するのに苦労してきました。構成について考えるとき、関数構成またはオブジェクト集約のいずれか(「継承よりも優先する構成」など)を考えますが、それはここで人々が使用している意味ではないようです。

上記の2つの例(つまり、ロックとモナド)のような式で使用される場合、誰かがこのフレーズの意味を説明できますか?


オブジェクトの集約よりも機能の構成に意味が近い。
アンドレスF.

大まかに非公式に、ロックを使用する2つの別個のものがある場合、それらを結び付けるのは困難です。(ロックの場合、デッドロックを導入せずに行うことは困難です。モナドの場合、型は複雑になる可能性があります)
-user253751

回答:


35

人々が言うとき、彼らは「コン」で実際には手段「まとめ」、および何を意味するか、「Xはコンない」何をしてどのように、あなたは正確に「X」が何であるかに応じて、非常に異なることができ、それらを一緒に入れました。

また、「作曲しない」と言うとき、若干異なることを意味する場合があります。

  1. 2つのXを1つにまとめることはできません。
  2. 2つのXを組み合わせることができますが、結果はXではない可能性があります(IOW:Xは構成の下で閉じられません)。
  3. 2つのXを組み合わせることができますが、結果のXは期待どおりに機能しない可能性があります。

#1の例は、スキャナー/レクサーを使用したパーサーです。「スキャナー/レクサーは作曲しない」というフレーズを聞くかもしれません。実際にはそうではありません。それらが意味するのは、「別個の字句解析ステージを使用するパーサーは構成しない」です。

なぜパーサーを作成したいのですか?さて、あなたがJetBrains、Eclipse Foundation、Microsoft、またはEmbarcaderoのようなIDEベンダーであり、Webフレームワーク用のIDEを構築したいと想像してください。通常のWeb開発では、多くの場合、言語が混在しています。<script>ECMAScriptを含む要素を含むHTMLファイルがあり、<style>CSSを含む要素。HTML、一部のプログラミング言語、および一部のテンプレート言語のメタ構文を含むテンプレートファイルがあります。「Python」、「テンプレートに埋め込まれたPython」、「CSS」、「HTML内のCSS」、「ECMASCript」、「HTML内のECMAScript」、「HTML」、「HTMLテンプレート」など。Python用、HTML用、テンプレート言語用の構文ハイライターを作成し、3つをテンプレートファイル用の構文ハイライターに作成します。

ただし、レクサーはファイル全体をトークンのストリームに解析しますが、これはその1つの言語にのみ意味があります。他の言語のパーサーは、レクサーが渡すトークンを処理できません。たとえば、Pythonパーサーは通常、字句解析器がインデントを追跡し、偽物INDENTDEDENTトークンをトークンストリームに挿入するように記述されているため、Pythonの構文が実際にそうでなくても、パーサーはコンテキストフリーになります。ただし、HTML lexerは空白文字を完全に無視します。HTMLでは意味がないためです。

ただし、単に文字を読み取るスキャナーレスパーサーは、文字ストリームを別のパーサーに渡すことができます。その後、パーサーはそれを戻すことができるため、作成がはるかに容易になります。

#2の例は、SQLクエリを含む文字列です。それぞれに構文的に正しいSQLクエリが含まれる2つの文字列を使用できますが、2つの文字列を連結すると、結果が構文的に正しいSQLクエリにならない場合があります。我々のようなクエリ代数を持っている理由のARelやる構成します。

ロックは#3の例です。ロックのある2つのプログラムがあり、それらを1つのプログラムに結合した場合、ロックのあるプログラムはまだありますが、2つの元のプログラムが完全に正しく、デッドロックや競合がない場合でも、結果のプログラムには必ずしもこれがありませんプロパティ。ロックの正しい使用法は、プログラム全体のグローバルプロパティであり、プログラムを作成するときに保持されないプロパティです。これは、例えば、取引、異なるやるコンを。トランザクションを正しく使用するプログラムは、別のそのようなプログラムで構成でき、トランザクションを正しく使用する結合プログラムを生成します。


1
言い換えると、「作曲しない」とは、「セミグループを形成しない」ことを意味します(または、わずかに強く、モノイド)。
ジョンパーディ

連想性が必要かどうかはわかりませんが、マグマのように(これは文字通り3秒前に学びました:-D)
ヨルグWミットタグ

ただし、「ロックが作成されない」と言うときに何を意味するかを誰かに尋ねると、「ロックと構成操作を備えた正しい並行プログラムのセットがマグマを形成する」と答えないでしょう。 。
ヨルグWミットタグ

もちろんです。単なる代替フレーズ。「フラットな」構成感を維持するには連想性が必要であるという感覚がありますが、それを裏付ける強い主張はありません。
ジョンパーディ

20

構成可能性とは、プログラムコンポーネントを簡単かつ確実に組み合わせて、より大きなコンポーネントとより複雑な機能を作成できることを意味します。

コンポーネントをより構成しやすくするために役立つこと:

  1. べき等。べき等関数は、同じパラメータ値で複数回呼び出された場合、常に同じ出力または副作用を生成します。これにより、関数呼び出しの結果が予測可能なため、構成可能性が向上します。

  2. 参照の透明性。 参照透過式は常に同じ結果に評価されます。これにより、同一の式を相互に置き換えることができ、ロックを使用せずに式を相互に独立して(つまり、異なるスレッドで)計算できるため、構成性が向上します

  3. 不変性。不変オブジェクトの状態は、作成後に変更することはできません。これにより、作成後にオブジェクトの状態が何らかの関数またはオブジェクトによって変更されたかどうかを心配することなく、オブジェクトの安定した値に依存できるため、構成可能性が向上します。

  4. 純度。純粋な機能には副作用はありません。入力と出力のみがあります。これにより、ある関数の出力を別の関数の入力に入れることができます。これは、関数の外の何かが変更されたかどうかを心配することなくできるためです。

ロックは、何らかの状態を共有する2つの操作を組み合わせるときに依存しなければならない外部要素であり、ロックの使用に固有の複雑さに関係するあらゆる種類の理由により、構成されません。

「モナドは作曲しない」というフレーズは私にはあまり意味がありません。モナドの全体的なポイントは、キーボード入力や画面出力などのステートフルなものを取得し、それを実際に構成可能なより純粋で数学的な形式に変えることです。


4
stackoverflow.com/questions/7040844/…は、「モナドが構成しない」とはどういう意味かを説明するのに良い仕事をしていると思いますが、モナドはロックよりもはるかに構成可能です。
Ixrec

「参照の透明性」と「純度」の箇条書きは、実際には純度の2つの要件です。「参照の透明性」という用語は明確に定義されていないため避けるべきです。
BlueRaja-ダニーPflughoeft

1
モナドは、特定の操作を行う代数構造です。最後の段落で説明したのは、IOキーボード入力などの「ステートフルアクション」をキャプチャするタイプです。IO実際、型の値は構成しますが、モナドは型全体 IOです。この型は、リスト型などのモナドである他の型とは合成しません。つまり、両方と同時にIO . List動作する型を体系的に生成することはできません。それは理にかなっていますか?私はそれをうまく説明したかどうかわかりません。 IOList
ティコンジェルビス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.