conduit
とpipes
両方はるかに成熟したmachines
以上ですが、 - 言った - machines
がconduit
とpipes
とは異なるパスを取るしようとしています。
machines
では、型引数の観点から比較的単純なAPIを試しています。 conduit
とpipes
の両方とも、5-6の異なるタイプの可変引数を使用することによって、すべての概念を統一することを選択しました。
機械は、入力言語で機械をパラメータ化する別の方法を採用しています。これは、すべてのonusを1つの余分な引数(またはPlan
の場合は2つ)に置きます。また、このように入力言語をパラメータ化することを選択することによって、複数の入力ソースから確定的に入力(非)を受け入れることができるマシンを使用する可能性が開かれます。結果は、基本的に、追加の 'emit'命令付きのフリーモナドです!
マシンをどのように構築し、使用するかに関する少し厳しいポリシーと引き換えに、最終的に結果コードの漸近性に関してより良い安全性を提供することができます。 pipes
とconduit
は、現実世界での使用の多くを持っていたとmachines
が私のために多かれ少なかれ遊び場、RúnarBjarnasonとポールChiusanoである、と述べた
。
これは、完全に消費しようとする入力には向いていますが、他の2つのAPIよりも複雑なリソースや解析には向いていません。
ここで、その数量詞について!
t
実際には定量的に存在する。こうすることで、k
パラメータの機能性を気にすることなく、マシン用のMonad
を作成することができます。これは、Source
が実装されているために重要です。私は仕事にSource
を必要としなかった場合は、その後、我々は使用することができますシンプルな
data Step k o r = Stop
| Yield o r
| Await (k r) r
これは不幸な副作用を持っているであろうと、あなたはコンパイラが知らないであろうと、Source
でマシンを構成するために行ったときどのようなFunctor
インスタンスを選択し、あなたは不要な型の注釈で泳ぐだろう。
kan-extensions
パッケージを使用しているときに私が取り上げたトリックが存在します。それはそこからのYoneda
タイプの1つの一般化です。
ありがとうございます。「k」について少し詳しく説明できますか? 'Await'は' k r'で構成されているのはなぜですか、特に 'k :: * - > *'と 'r'でパラメータ化された理由は何ですか?私は、 'ティー(Tee)'、 'ワイ'(Wye)、 'Is'を調べて、異なる' k'の例を見ようとしましたが、それでも理解できません。 –
'k a 'は、あなたにデータを供給しているものの作成しているリクエストのタイプです。 'a'はリクエストの結果を表します。 'Await'には、「リクエストが成功した場合の対処方法」と「失敗時の対処方法」の2つの引数があります。 1つの入力に対して、入力を与えることができる '(i - > r)'から 'Machine(( - >)i)'関数が与えられるように、k =( - >)i'を使うことができます。 'Tee'では2つの関数のうちの1つを使用するので、どちらかの入力を個別にブロックすることができます。 'Wye'は、同時にまたは両方の入力をブロックすることを許可します。 'Is'は上記の'( - >) 'のように使われます。 –
さらにもう一つの質問ですが、なぜ「計画」と「機械」があるのですか?なぜ区別? –