2013-06-24 1 views
28

私はコンセプトを学びたいので、machinesのようなライブラリを理解して使用することができます。機械とコンジット(または他の同様のライブラリ)の概念の違いは何ですか?

私はRúnar Bjarnason's talk on machinesに従ってみましたが、情報が少なすぎます。基本的にはデータタイプがたくさんあります。私もk

newtype Machine k o = Step k o (Machine k o) 
data Step k o r = Stop 
       | Yield o r 
       | forall t . Await (t -> r) (k t) r 

または何tがあり、それを定量いる理由であるかを理解することはできません。または、コンジットのようなライブラリとのマシンの概念の違いは何ですか?

答えて

44

conduitpipes両方はるかに成熟したmachines以上ですが、 - 言った - machinesconduitpipesとは異なるパスを取るしようとしています。

machinesでは、型引数の観点から比較的単純なAPIを試しています。 conduitpipesの両方とも、5-6の異なるタイプの可変引数を使用することによって、すべての概念を統一することを選択しました。

機械は、入力言語で機械をパラメータ化する別の方法を採用しています。これは、すべてのonusを1つの余分な引数(またはPlanの場合は2つ)に置きます。また、このように入力言語をパラメータ化することを選択することによって、複数の入力ソースから確定的に入力(非)を受け入れることができるマシンを使用する可能性が開かれます。結果は、基本的に、追加の 'emit'命令付きのフリーモナドです!

マシンをどのように構築し、使用するかに関する少し厳しいポリシーと引き換えに、最終的に結果コードの漸近性に関してより良い安全性を提供することができます。 pipesconduitは、現実世界での使用の多くを持っていたと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つの一般化です。

+1

ありがとうございます。「k」について少し詳しく説明できますか? 'Await'は' k r'で構成されているのはなぜですか、特に 'k :: * - > *'と 'r'でパラメータ化された理由は何ですか?私は、 'ティー(Tee)'、 'ワイ'(Wye)、 'Is'を調べて、異なる' k'の例を見ようとしましたが、それでも理解できません。 –

+4

'k a 'は、あなたにデータを供給しているものの作成しているリクエストのタイプです。 'a'はリクエストの結果を表します。 'Await'には、「リクエストが成功した場合の対処方法」と「失敗時の対処方法」の2つの引数があります。 1つの入力に対して、入力を与えることができる '(i - > r)'から 'Machine(( - >)i)'関数が与えられるように、k =( - >)i'を使うことができます。 'Tee'では2つの関数のうちの1つを使用するので、どちらかの入力を個別にブロックすることができます。 'Wye'は、同時にまたは両方の入力をブロックすることを許可します。 'Is'は上記の'( - >) 'のように使われます。 –

+1

さらにもう一つの質問ですが、なぜ「計画」と「機械」があるのですか?なぜ区別? –