OK、他の回答にコメントした後、コメントを適切な回答に変えることもできると考えました。
ストリームは確かに遅延型であり、必要に応じて要素を計算するだけです (また、 を使用して、 for の#::
ように要素ごとにストリーム要素を構築できます)。例として、以下は例外をスローしません。::
List
(1/2) #:: (1/0) #:: Stream.empty
これは、 を適用するとき#::
に、テールが名前で渡されるため、熱心に評価するのではなく、必要な場合にのみ評価されるためです (詳細についてはConsWrapper.# ::
、const.apply
およびクラスCons
をStream.scala
参照してください)。一方、ヘッドは値で渡されます。つまり、何があっても、常に熱心に評価されます (Senthil が述べたように)。これは、次のことを行うと実際に ArithmeticException がスローされることを意味します。
(1/0) #:: Stream.empty
ストリームについて知っておく価値のある落とし穴です。ただし、これはあなたが直面している問題ではありません。
あなたの場合、単一の Stream をインスタンス化する前に算術例外が発生します。を呼び出すStream.apply
とlazy val bad = Stream(1/0)
、引数は名前によるパラメーターとして宣言されていないため、熱心に実行されます。Stream.apply
実際には vararg パラメータを取り、それらは必ず値渡しされます。また、名前で渡された場合でも、ArithmeticException
前述のように Stream のヘッドは常に早期に評価されるため、すぐにトリガーされます。