Haskell関数の構成は、パイプとフィルターのアーキテクチャパターンのインスタンスですか?


9

パイプとフィルターのアーキテクチャパターンは、各要素の出力が次の要素の入力になるように配置された一連の処理要素として定義されます。すべての例は、ある種の共有バッファを介して実行されるプロセス間またはスレッド間接続を考慮しているようです。

私には、Haskell関数構成が同じタスクを実行しているようです。関数の順序付けだけで、明示的なバッファーがパイプとして使用されていない場合でも、それはこのパターンのインスタンスであると言えますか?はいの場合、怠惰でない言語でも同じことが言えますか?

回答:


8

それらは接続されていますが、接続はその逆です(一種)。

適切なカテゴリの形態合成は、関数合成(Set厳密な言語とCPO遅延言語の場合)とプロセス合成(カテゴリが(AFAIK、名前なし)カテゴリの場合、オブジェクトが文字列であり、形態がシェルである場合)の両方を正確にモデル化しますプロセス、および構成はパイプ演算子です)。シェルプロセスは、型の(レイジー)関数として一般性や精度を失うことなく見ることができます。また、型のString -> WriterT String IO String純粋な関数は、型の関数String -> Stringとの間で可逆的に変換できるString -> Identity Stringため、どちらも実際に(>>=)は偽装されています。


1
CPOカテゴリとは何ですか?私のgoogle-fuは弱い:(
Andres F.

3
@AndresF。C完全なアーPティカルOrders のカテゴリ。
Ptharienの炎2013

2

違いがあります。パイプとフィルターはデータとデータ接続を処理しますが、Haskell関数構成はファーストクラスの関数を処理します。ファーストクラスの関数は、パイプやフィルターではできない方法で構成できます。

さらに読み
関数型プログラミングのコンテキストで構成可能性の平均値を何?


1
コンポジションはそれ自体がファーストクラスの関数なので、コンポジションは必ずしもファーストクラスの関数を処理するわけではありません。例えば、関数の構図取り++組成物であり、.++ . ++値が二回インクリメントした値とリターンを取るだろうが、++ファーストクラスの関数ではありません、それは値を取り、値を返すのみ。合成関数は、2つの関数を取り、1つを返す最初のクラス関数です。
ジミーホファ2013年

1
@JimmyHoffa、私はあなたが「ファーストクラス関数」の概念を「高次関数」と混同していると思います。言語に「ファーストクラス関数」がある場合、他のファーストクラスデータ型と同じように関数を扱います。それらは、関数に渡したり、関数から返したり、データ構造に格納したりできます。高次関数は、関数パラメーターを取得するか、関数値を返すことにより、関数のファーストクラスの性質を利用します。
Levi Pearson

@LeviPearsonええ、私が朝起きたとき、私はそのコメントを書いて、誤って脳を横向きにしていたに違いありません。P.SE向けの優れたコンテンツをここで作成し続けている場合は、P.SEの一般的なチャットで
Jimmy Hoffa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.