私は深く「ネストされた」理解のために、x、y、zの3つのレベルに単純化されています。私はStream
xを作ることを望ん怠惰y、zの計算になるだろうされた:ネストされた怠惰な理解のため
val stream = for {
x <- List(1, 2, 3).toStream
y <- List("foo", "bar", "baz")
z = {
println("Processed " + x + y)
x + y
}
} yield z
stream take (2) foreach (doSomething)
しかし、これは3枚のプリントによって証明されるように、すべての3つの要素を、計算します。最初の2つだけを計算したいのですが、それらはストリームからすべて取るためです。私はList
のようにtoStream
を呼び出すことでこれを回避することができます。理解のあらゆるレベルでそれを呼び出すよりも良い方法がありますか?
私の質問を明確にしました。私はzを「ユニット」とするつもりはなかった。今はストリームの最初の2つの要素とそれらを使って 'doSomething'を取るだけですが、3つのプリントが前にあります。 3番目のプリント(「計算」)を行わないようにするにはどうすればよいですか? – Bluu
@Bluu "1"の数字から明らかなように、3つの計算は 'y'の各要素に対して行われます。私が言ったように、頭は常に評価されています。 'stream take 4 foreach println'を試してみると、最初の3回を取ってから2番目のバッチが計算されていることがわかります –
今見ています。ありがとう。そしてhead_の頭を厳密に評価するだけなので、 'List(" foo "、" bar "、" baz ")。toStream'を呼び出す必要があります。あなたはその周りに何か方法を知っていますか? – Bluu