問題タブ [strictness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
4254 参照

haskell - ボックス化されていないタイプと厳密性の関係は何ですか?

のようなボックス化されていない型と、のようInt#な厳密な関数f (!x) = ...は何か違うものですが、概念的な類似性が見られます-それらは何らかの方法でサンク/怠惰を許可しません。HaskellがOcamlのような厳密な言語である場合、すべての関数は厳密であり、すべての型はボックス化されていません。ボックス化されていないタイプと強制的な厳密性の間にはどのような関係がありますか?

0 投票する
1 に答える
879 参照

haskell - Haskell における同時チャネルの厳密な評価手法

私は Haskell スレッドをいじっていますが、遅延評価された値をチャネル全体で通信するという問題に直面しています。たとえば、N 個のワーカー スレッドと 1 個の出力スレッドがある場合、ワーカーは評価されていない作業を通信し、出力スレッドがそれらの作業を実行することになります。

さまざまなドキュメントでこの問題について読み、さまざまな解決策を見てきましたが、機能する解決策は 1 つだけで、残りは機能しません。以下は、ワーカー スレッドが長時間かかる計算を開始するコードです。最初のスレッドが最も長くかかり、後のスレッドが早く終了するように、スレッドを降順で開始します。

ほとんどの手法を使用して、結果は生成された順序で報告されます。つまり、実行時間の長い計算が最初になります。これは、出力スレッドがすべての作業を行っていることを意味すると解釈します。

これに対する答えは厳密なチャネルになると思いましたが、うまくいきませんでした。文字列の WHNF は、最も外側のコンストラクター (文字列の最初の文字に対して nil または cons) を強制するだけなので、不十分であることを理解しています。はrdeepseq完全に評価されるはずですが、違いはありません。私が見つけた唯一の方法Control.Exception.evaluate :: a -> IO aは、文字列内のすべての文字をマップすることです。(forceいくつかの異なる代替方法については、コード内の関数のコメントを参照してください。) の結果は次のControl.Exception.evaluateとおりです。

rdeepseqでは、チャネルを厳密に設定したり、この結果を生成したりしないのはなぜですか? 他のテクニックはありますか?最初の結果が壊れている理由を誤解していますか?

0 投票する
2 に答える
746 参照

haskell - Haskell のリストの厳密性を強制する

結果として短い文字列を生成する、非常に時間のかかるアルゴリズムを作成しました。(putStrLn 経由で) 印刷しようとすると、文字ごとに画面に表示されます。なぜそれが起こったのか理解できたので、実際の印刷の前に文字列の評価を強制しようとしました。

しかし、これはほとんど役に立ちません。プログラムをデバッグで実行すると、!str が最初の文字のみを強制的に評価していることに気付きました。

その理由と、これに対処する方法を知っている人はいますか?

0 投票する
2 に答える
1598 参照

performance - haskellでテーブル(Data.Map)を厳密にする方法は?

Haskell(素敵な言語)を学ぶために、私はSpojから問題を試しています。

コンパイル時にすべて既知の19000要素のテーブルがあります。'seq'を使用してテーブルを厳密にするにはどうすればよいですか?これが私のコードからの(強力な)単純化された例です。

0 投票する
3 に答える
717 参照

haskell - リスト内包に厳密さを設定するにはどうすればよいですか?

厳密に評価されたリスト内包表記に従って、bangパターンの代わりにseqを使用するように書き直す方法が、少し行き詰まっています。

何か案が ?

私はもう試した

しかし、残念ながら、これはWHNFに評価を強制するものではありません。

0 投票する
2 に答える
864 参照

haskell - zipWith が強制するのに map が厳密さを強制しないのはなぜですか?

zipWith 関数には 2 つの厳密なバージョンがあります。

1) 非常に厳密で、リスト l1 と l2 の要素が評価されるため、それらのサンクがすべてのスタック スペースを消費することはありません (Don Stewart コード)

2) それほど厳密ではありませんが、他の方法で評価を強制しようとします。

問題は、 mapを使用した 2 番目の例の同等のコードで、関数も厳密にならないのはなぜですか?

0 投票する
9 に答える
36084 参照

haskell - ウィークヘッドノーマルフォームとは何ですか?

ウィークヘッドノーマルフォーム(WHNF)とはどういう意味ですか?ヘッドノーマルフォーム(HNF)とノーマルフォーム(NF)はどういう意味ですか?

実世界のハスケルは次のように述べています。

おなじみの 関数は、式をヘッドノーマルフォーム (略してHNF)seq と呼ぶものに評価します 。最も外側のコンストラクター(「ヘッド」)に到達すると停止します。これは、式が完全に評価される正規形 (NF)とは異なり ます。

また、Haskellプログラマーがウィーク ヘッドノーマルフォーム(WHNF)を参照しているのを聞くでしょう 。通常のデータの場合、弱い頭の通常の形式は頭の通常の形式と同じです。違いは関数に対してのみ発生し、ここで私たちを気にするのはあまりにも厄介です。

いくつかのリソースと定義(HaskellWikiとHaskellメールリストと無料辞書)を読みましたわかりませ。誰かが例を挙げたり、素人の定義を提供したりできますか?

私はそれが次のようになると推測しています:

WHNFとHNFとどのようseqに関係していますか?($!)

アップデート

私はまだ混乱しています。私はいくつかの答えがHNFを無視すると言っていることを知っています。さまざまな定義を読むと、WHNFとHNFの通常のデータに違いはないようです。ただし、関数に関しては違いがあるように見えます。違いがなかったのなら、なぜseq必要なのfoldl'ですか?

もう1つの混乱のポイントは、Haskell Wikiからのものです。これは、seqWHNFに還元され、次の例には何もしません。それから彼らは彼らがseq評価を強制するために使用しなければならないと言います。それはそれをHNFに強制していませんか?

一般的な初心者スタックオーバーフローコード:

seqとweakheadnormal form(whnf)を理解している人は、ここで何が悪いのかをすぐに理解できます。 (acc+x, len+1) はすでにwhnfにあるので、 値をwhnfに減らすseq (の定義内の foldl')はこれに対して何もしません。このコードは、元の例と同じようにサンクを構築し foldl ます。それらはタプルの中にあります。解決策は、タプルのコンポーネントを強制することです。

--StackoverflowのHaskellWiki

0 投票する
8 に答える
5978 参照

haskell - Haskellの厳格さのポイントは何ですか?

Haskellがデフォルトで怠惰であることは誰もが知っています(または知っておくべきです)。評価する必要があるまで、何も評価されません。では、いつ何かを評価する必要がありますか?Haskellが厳格でなければならない点があります。私はこれらを「厳密さのポイント」と呼んでいますが、この特定の用語は私が思っていたほど広くはありません。私によると:

Haskellの削減(または評価)は、厳密なポイントでのみ発生します。

したがって、問題は、ハスケルの厳格さのポイントは正確には何ですか?私の直感ではmainseq/ bangパターン、パターンマッチング、およびIOを介して実行されるアクションmainが主要な厳密点であると言われていますが、なぜそれを知っているのかはよくわかりません。

(また、それらが「厳密点」と呼ばれない場合、それらは何呼ばれますか?)

良い答えには、WHNFなどについての議論が含まれると思います。また、ラムダ計算に触れる可能性があると思います。


編集:この質問についての追加の考え。

この質問を振り返ったように、厳密性ポイントの定義に何かを追加する方が明確だと思います。厳密性ポイントは、さまざまなコンテキストとさまざまな深さ(または厳密さ)を持つことができます。「Haskellでの削減は厳密性ポイントでのみ発生する」という私の定義に戻って、この節を追加しましょう。「厳密性ポイントは、周囲のコンテキストが評価または削減されたときにのみトリガーされます。」

だから、私が望む種類の答えをあなたに始めさせようと思います。main厳しさのポイントです。これは、そのコンテキストの主要な厳密点であるプログラムとして特別に指定されています。プログラム(mainのコンテキスト)が評価されると、mainの厳密点がアクティブになります。メインの深さは最大です:それは完全に評価されなければなりません。Mainは通常、IOアクションで構成されます。これは、コンテキストがである厳密ポイントでもありますmain

今、あなたは試してみます:seqこれらの用語で議論し、パターンマッチングします。関数適用のニュアンスを説明してください:それはどのように厳格ですか?どうですか?どうdeepseqですか?letcaseステートメント?unsafePerformIODebug.Trace?トップレベルの定義?厳密なデータ型?強打パターン?などこれらのアイテムのうち、シーケンスまたはパターンマッチングの観点から説明できるものはいくつありますか?

0 投票する
4 に答える
16818 参照

haskell - 演算子 && は Haskell で厳密ですか?

たとえば、fnB :: a -> Boolreturn まで意味のない操作がありfnA :: BoolますFalse。CI では、次の 2 つの操作を 1 つのifブロックにまとめることができます。

Cは false を返すfnBまで実行しないことを保証します。fnA

seqしかし、Haskell は怠け者であり、通常、コードを厳密にするために 、$!、またはその他の何かを使用しない限り、どの操作が最初に実行されるかは保証されません。一般的に、これは私たちが幸せになるために必要なものです。しかし、演算子を使用すると、結果が返されるまで評価されないこと&&が予想されます。Haskell は でそのような保証を提供しますか? また、Haskellは Falseを返しても評価しますか?fnBfnA&&fnBfnA

0 投票する
2 に答える
1263 参照

haskell - foldlは、その厳密ないとこであるfoldl'よりも好ましいですか?

Haskellにはリスト用の2つの左折り関数があります:foldlと「厳密な」バージョン、foldl'。非厳密の問題はfoldl、サンクの塔を構築することです。

これはメモリを浪費し、リストに項目が多すぎるとスタックオーバーフローを引き起こす可能性があります。 foldl'一方、すべてのアイテムにアキュムレータを強制します。

ただし、私が知る限り、意味的foldl'にはと同等です。通常の形式で評価するには、ある時点でアキュムレータを強制する必要があります。ヘッドノーマルフォームが必要なければ、そもそも評価していません。foldlfoldl (+) 0 [1..5]foldl (+) 0 [1..5]

foldlそれ以上の振る舞いをしたいという説得力のある理由はありfoldl'ますか?