パイプとフィルターのアーキテクチャパターンは、各要素の出力が次の要素の入力になるように配置された一連の処理要素として定義されます。すべての例は、ある種の共有バッファを介して実行されるプロセス間またはスレッド間接続を考慮しているようです。
私には、Haskell関数構成が同じタスクを実行しているようです。関数の順序付けだけで、明示的なバッファーがパイプとして使用されていない場合でも、それはこのパターンのインスタンスであると言えますか?はいの場合、怠惰でない言語でも同じことが言えますか?
パイプとフィルターのアーキテクチャパターンは、各要素の出力が次の要素の入力になるように配置された一連の処理要素として定義されます。すべての例は、ある種の共有バッファを介して実行されるプロセス間またはスレッド間接続を考慮しているようです。
私には、Haskell関数構成が同じタスクを実行しているようです。関数の順序付けだけで、明示的なバッファーがパイプとして使用されていない場合でも、それはこのパターンのインスタンスであると言えますか?はいの場合、怠惰でない言語でも同じことが言えますか?
回答:
それらは接続されていますが、接続はその逆です(一種)。
適切なカテゴリの形態合成は、関数合成(Set
厳密な言語とCPO
遅延言語の場合)とプロセス合成(カテゴリが(AFAIK、名前なし)カテゴリの場合、オブジェクトが文字列であり、形態がシェルである場合)の両方を正確にモデル化しますプロセス、および構成はパイプ演算子です)。シェルプロセスは、型の(レイジー)関数として一般性や精度を失うことなく見ることができます。また、型のString -> WriterT String IO String
純粋な関数は、型の関数String -> String
との間で可逆的に変換できるString -> Identity String
ため、どちらも実際に(>>=)
は偽装されています。
C
完全なアーP
ティカルO
rders のカテゴリ。
違いがあります。パイプとフィルターはデータとデータ接続を処理しますが、Haskell関数構成はファーストクラスの関数を処理します。ファーストクラスの関数は、パイプやフィルターではできない方法で構成できます。
++
組成物であり、.
、++ . ++
値が二回インクリメントした値とリターンを取るだろうが、++
ファーストクラスの関数ではありません、それは値を取り、値を返すのみ。合成関数は、2つの関数を取り、1つを返す最初のクラス関数です。
CPO
カテゴリとは何ですか?私のgoogle-fuは弱い:(