タグ付けされた質問 「lazy-evaluation」

遅延評価とは、値が必要でない限り式の評価を回避し、式の評価結果をすべての使用で共有することで、式を複数回評価する必要がないようにするさまざまな概念を指します。

4
Haskellには末尾再帰最適化がありますか?
今日、UNIXで「time」コマンドを発見し、Haskellの末尾再帰関数と通常の再帰関数のランタイムの違いを確認するのに使用すると思いました。 私は以下の関数を書きました: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x * …


3
並列無限Javaストリームがメモリ不足になる
次のJavaプログラムがを提供する理由を理解しようとしていますがOutOfMemoryError、対応するプログラムなしで.parallel()は対応していません。 System.out.println(Stream .iterate(1, i -> i+1) .parallel() .flatMap(n -> Stream.iterate(n, i -> i+n)) .mapToInt(Integer::intValue) .limit(100_000_000) .sum() ); 2つの質問があります。 このプログラムの意図する出力は何ですか? これがない.parallel()場合、これは単純に出力するように見えますsum(1+2+3+...)。つまり、flatMapの最初のストリームで単に「行き詰まる」ということです。これは理にかなっています。 並列では、予想される動作があるかどうかはわかりませんが、それは何らかの形で最初のnストリームをインターリーブしたと思われます。ここnで、並列ワーカーの数です。また、チャンク/バッファリングの動作に基づいて少し異なる場合もあります。 メモリが不足する原因は何ですか?具体的には、これらのストリームが内部でどのように実装されるかを理解しようとしています。 何かがストリームをブロックしていると思うので、ストリームが終了せず、生成された値を取り除くことができますが、評価の順序とバッファリングが発生する場所がわかりません。 編集:必要に応じて、Java 11を使用しています。 Editt 2:どうやら同じことは単純なプログラムIntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()でも発生するので、limitではなくの怠惰に関係している可能性がありflatMapます。

1
Haskellで評価される関数a->()にはどのような規則がありますか?
タイトルが言うように:評価されるユニットを返すHaskell関数にはどのような保証がありますか?そのような場合、いかなる種類の評価も実行する必要はないと考えられ()ますが、厳密さの明示的な要求が存在しない限り、コンパイラーはそのようなすべての呼び出しを即時値に置き換えることができます。リターン()またはボトム。 私はこれをGHCiで実験しましたが、逆のことが起こっているようです。つまり、そのような関数は評価されているように見えます。非常に原始的な例は f :: a -> () f _ = undefined 評価f 1すると、が存在するためにエラーがスローされるundefinedため、評価が確実に行われます。ただし、評価の深さは明確ではありません。場合によっては、を返す関数へのすべての呼び出しを評価する必要があるほど深くなるように見えることがあり()ます。例: g :: [a] -> () g [] = () g (_:xs) = g xs このコードは、を指定すると無限にループしg (let x = 1:x in x)ます。しかしその後 f :: a -> () f _ = undefined h :: a -> () h _ …

2
Rakuを使用してe番号を計算する
式を計算してe定数(別名オイラー数) を計算しようとしています 階乗と除算を一度に計算するために、私はこれを書きました: my @e = 1, { state $a=1; 1 / ($_ * $a++) } ... *; say reduce * + * , @e[^10]; しかし、うまくいきませんでした。それを正しく行う方法は?

5
自分で繰り返さずにこのアルゴリズムを遅延させるにはどうすればよいですか?
(この質問に対する私の答えに触発されました。) 次のコードを検討してください(指定された入力以下の最大の要素を見つけることが想定されています)。 data TreeMap v = Leaf | Node Integer v (TreeMap v) (TreeMap v) deriving (Show, Read, Eq, Ord) closestLess :: Integer -> TreeMap v -> Maybe (Integer, v) closestLess i = precise Nothing where precise :: Maybe (Integer, v) -> TreeMap v -> Maybe (Integer, v) precise closestSoFar …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.