私はメタPPCGにproud haskellerによってthis answerにハスケルのこのスニペットを見た:再帰的な遅延リストがScalaでスタックを吹き飛ばしてしまうのはなぜですか?
x=2:x
私は「私はScalaでそれを行うことができ、待って!」、と思いましただから私は試してみました:それはコンパイルされ、私のコンソールが素敵x: List[Int] = <lazy>
を印刷
lazy val x: List[Int] = 2 :: x
。しかし、StackOverflowException
に次の行の結果の各:x
を使用する試みがx
を計算しようとしているスタックを吹く(どちらかというか、スタックオーバーフローがそれを印刷しようとして起こるように、最後の1に基づいて
x take 1
x.head
x(1)
x
は、それが見えますコンソールで)。この例では、Scalaの怠惰とHaskellの怠惰はどう違うのですか?これはScalaのlazy val
の機能ですか、List
クラスは完全なテールを必要としていますか?
まだ、あなたはそれをコンパイルするための戻り値の型が必要ですが、それでもいいです。怠け者のvalでは '' lazy val x:Stream [Int] = 2#:: x'です。 –
@BrianMcCutchon、そうです。 2番目のパラグラフを作成してそれを逃した。しかし、私は、「ストリーム」の価値を怠ってしまう点はほとんどないと主張しています。それが 'val'ならば、結果(評価された要素)はメモされます。それが 'var'なら、そうではありません。それを「怠け者のヴァル」にすることは、あなたをあまり買わない。 – jwvh
memoizedされた 'val'ストリームと' mem'されていない 'def'(' var'ではなく)ストリームとの違いを明確にしようとするもう一つのタイプミスです。 – jwvh