haskell – MachinesとConduits(あるいは他の同様のライブラリ)の概念的な違いは何ですか?

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

それとも、何であり、なぜそれが定量化されているのか。あるいは、コンジット風ライブラリとマシンの概念上の違いは何ですか?

ベストアンサー
コンジットとパイプはどちらも機械よりもはるかに成熟していますが、それにもかかわらず、機械はコンジットやパイプとは異なる道をたどろうとしています。

マシンでは、型引数に関して比較的単純なAPIを試しています。コンジットとパイプはどちらも、5〜6個の異なる型変数引数を使用して、それらの概念すべてを統一することを選択しました。

Machinesは、マシン(またはプラン)をその「入力言語」に基づいてパラメータ化するという異なるアプローチを取ります。これは、すべての負担を1つの追加引数(またはプランの場合は2つ)に置くものです。また、このように入力言語をパラメータ化することを選択することにより、複数の入力ソースから決定論的に入力を受け入れることができるマシンを使用する可能性が開かれます。結果は、基本的には、追加の「発行」命令を持つ単なる空きモナドです。

あなたがどのようにして機械を構築し使用するかについてのもう少し厳密な方針と引き換えに、それは結果として得られるコードの漸近線に関してより良い安全性を提供することができます。

とは言っても、パイプとコンジットには実世界での用途がたくさんあり、マシンは私にとって多かれ少なかれ遊び場になります、RúnarBjarnasonとPaul Chiusano。

それは現在あなたが完全に消費しようとしている入力に取り組むのに適しています、しかしあなたがそれらの他の2つのAPIで得られるものより複雑なリソースを扱うか解析するためにそうではありません。

さて、その数量詞について!

実存的に定量化されている。そうすることによって、マシン用のモナドがkパラメータの関数性を気にしないようにすることができます。 Sourceが実装されている方法のため、これは重要です。もし私がSourceを動かす必要がなければ、もっと簡単なものを使うことができます。

data Step k o r = Stop
                | Yield o r
                | Await (k r) r

これは、あなたがSourceを使ってMachineを作成しようとした時、コンパイラがFunctorのインスタンスを選ぶべきかわからず、不必要な型の注釈をつけてしまうという不幸な副作用をもたらすでしょう。

実存的定量化は、kan-extensionsパッケージを扱う際に私が拾ったトリックです。そこからの米田タイプの一つの一般化です。

転載記事の出典を記入してください: haskell – MachinesとConduits(あるいは他の同様のライブラリ)の概念的な違いは何ですか? - コードログ