2012-05-07 9 views
13

ストリーム(遅延リスト)とモナドの間に違いはありますか? 技術的な実装からではなく、概念的および数学的な観点から。ストリームとモナド

それ以外の場合、biuniqueは1対1で対応していますか?

より正確には、ストリームとして、Scheme言語のSRFI-41からの「偶数ストリーム」を意味します。

モナド以外のカテゴリですか?もしそうなら、どのカテゴリですか?

「偶数ストリーム」は、モナドのような副作用の制御を保証することができますか?

+0

私が理解する限り、Schemesのストリームはレイジー値ですが、Monadsは計算のカスタムチェーンです。 – Salil

+0

ストリームは正確に遅延リストです。モナドや怠惰なリストなどを使わずに「怠惰な値」を表示するにはどうすればいいですか? 「遅延値」と不変の関数変数を混同しないでください。まあ、「計算のカスタムチェーン」は「偶数ストリーム」と1対1で対応していますか? – cofp

+0

。 「偶数ストリーム」とモナドの両方の定義を比較する。そしてその公理も。私が知っているように、各ストリームはモナドを介して表現することができます。それぞれのモナド「値」や「計算」が「偶数ストリーム」で表現できるのは本当ですか?制限はありますか? – cofp

答えて

5

サリルは、既に述べたように、2つの異なる概念がある:

ストリームのみいくつかの方法を記憶し、すなわち、典型的には、値の(潜在的に無限の)リストであり、必ずしも必要ではないが、遅延様式で計算します要求時に値を計算する。どのような方法でモナドを伴わないその周りの多くの例があります:

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers)) 

あなたはどこにでも(潜在的または必然的に)有限それらを使用することができますので、また、ストリームとして、有限、事前に計算され、リストを検討することは非常に便利です遅延ストリームを使用できます。

したがって、ストリームは次の値と残りのストリームを取得する操作next: streamType -> (valueType streamType)を持つものです。

 

モナド、一方、個々のコマンドを組み合わせることによってソースコードを書くのデータ構造の少ない、より方法です。

おそらく最も簡単な便利な例は "Maybe monad"です - 私はSchemeでどのように見えるかわかりませんが、考え方は次のとおりです。(f g h)と入力xのリストが与えられたら、計算を順番に実行すると、ほぼ(f (g (h x)))のようになりますが、各関数が正常に失敗するようにしてください。gnilを返す場合は、(f nil)を呼び出さず、ただちにnilを返してください。あなたは、もちろん、様々な便利な方法で両者を組み合わせて、モナドを使って、ストリーム値を計算するか、正確に関数型プログラミングの期待を次されていないI/Oストリームのようなストリームの使用をカプセル化することができます

 

(ストリームのある以前の状態への参照を格納するコードを避けるために)モナドであるが、それらはまったく異なる目的を果たす。モザイクを関数に適用すると、関数が与えられます。一方、ストリームは高次関数ではなく、値のリストです。

明らかに、モナドによって定義される(またはあなたの視点に応じて返される)関数は、ストリームのインプリメンテーションであり、ストリームから抽出された値はモナドになることができます。しかし、上記のように、ストリームとはまったく異なるものを実装するモナドがあります。モナドとして実装されていないストリームがあるかどうかは、おそらくあなたがその用語を正確に使用するかによって異なります。私は、無限の流れが適切にモナドとして適格であるかどうかわからないと告白しなければならない。有限リストは明らかにそうです。

+0

あなたの答えはずっと便利です。そして以前の答えに対する反対はどんな違いにも対抗していませんでした。違いを見つけるのは問題の問題でした。しかし、以前の答えに対する反対は、Schemeの約束による "怠惰な値"の方程式に反するものでした。そして何か他のものに対するものですが、違いには全く反対しません。 – cofp

+0

さて、質問の文章の中には、「カバーの下」を見ないようにするという提案がありました。だから、「データ構造」と何かをする「方法」(「コードを書く」)の違いは何ですか?時間と状態からの抽象化の観点から。何かが多かれ少なかれ「データ構造」であると言うこと。そして、「怠惰なリスト」の構造やちょうど「方法」ですか? 「ストリームが正確に遅延リストである」という記述は、「遅延値」に対する唯一の反対であったためです。このことから、そのストリームには正確に「データ構造」はありません。 – cofp

+0

"より高い機能"についてのあなたの推論はより強力なIMHOです。より高い機能として「偶数ストリーム」を使用する方法はないという証拠がまだ必要ですが、したがって、ストリームはモダンよりも制限的であることが証明されるだろう。しかし、それらが完全に異なっていると言うには、ストリームがモナドを介して表現できることを忘れないでください。したがって、ストリームは単なるモナドのサブカテゴリです。しかし、このサブカテゴリは厳密な "サブ"ですか?それとも、それは部分的な交差点ですか? IMHO質問は開いています。 – cofp