厳格な評価を使用するHaskellコンパイラまたはプリプロセッサはありますか?
-
13-09-2019 - |
質問
怠zyな評価ではなく、デフォルトで厳格な評価を使用するHaskellコンパイラを探しています。私はOCAMLを使用するだけですが、Haskellの構文は 良くなったね OCAMLよりも(そしてHaskellは純粋で、タイプクラスなどのクールな機能があります)。
私は本当に絶えず置かれません !
砂 $!
私のプログラム全体で。 SwitchまたはPreprocessorを備えたコンパイラが厳格さの注釈を入れるのは本当にいいでしょう。また、無限のリストのようなものが必要な場合に備えて、特定の場所で怠zyな評価を使用する方法があれば役立ちます(おそらく決してそうしないでしょう)。
怠zyな評価の方が良いと私に納得させようとしないでください、私は本当にパフォーマンスが必要です。 IIRC、サイモン・ペイトン・ジョーンズは、怠zyな評価は本当に必要ではないとさえ言った。それは主に言語を不純にするのを防ぐためだった。
解決
厳密な評価を使用するHaskellコンパイラがある場合、Haskellはコンパイルされません。 怠惰 非強さはHaskell Specの一部です!
ただし、代替手段があります。
DDC Haskellの残りのすべてを保持しながら、破壊的な更新のようなものをサポートするHaskellの明示的に怠zyなバリアントを作成する試みです。 1つの問題があります。コンパイラは現在、αステージにのみ存在しますが、少なくとも使用可能なようです。
Haskellの「正しい方法」を使用することを学びます。テストケースを公開可能なものに簡素化できる場合は、に投稿できます。 Haskell-Caféメーリングリスト, 、人々は、非強さの影響に関するこれらの種類の質問に非常に役立ちます。
他のヒント
私は本当に絶えず置かれません!sと$!sは私のプログラム全体に
それがハスケルのプログラミング方法である場合、あなたはそれを間違っています:)あなたは単にこれをする必要がありません。 GHCを使用し、-O2を使用し、必要に応じて厳格なデータ型を使用し、適切な場合は怠zyなデータ型を使用します。怠inessが問題になると仮定しないでください - それは多くの問題の解決策です。
参照してください GHC-Strict-Plugin, 、の例 GHCのプラグインフレームワーク, 、で説明されています モナドリーダー12.
あなたの痛みが分かります。私の日々のプログラミングでの私の最大のピタは、それらを扱うことです!@#$%^&(スペースリーク。
ただし、それが役立つ場合、時間とともに(難しい方法で)これに対処する方法について学び、それは良くなります。しかし、私はまだ、アンディ・ギルが私のすべての問題を修正するために彼の魔法のスペースリークプロファイラーを出てくるのを待っています。 (私は彼が最後のICFPで私に彼のオフハンドコメントを持っています。彼はこのクールなアイデアを実装する約束として夢見ていました。)
怠zyな評価が世界で最高のものであることをあなたに納得させようとはしませんが、それには特定の良い点があります。 3.5 MBほどのメモリ(2MB以上がGHCランタイム)のみを使用しながら、ギガバイトのデータで幸せに実行されるさまざまなコンビネーターを介して怠zyなリストをスクートするいくつかのストリーム処理プログラムを持っています。そして、昨年、私が指摘したよりも賢い人は、典型的なHaskellプログラマーとして、あなたが怠zyな評価にどれだけ依存しているかを本当に驚かせるだろうと私に指摘しました。
しかし、私たちが本当に必要としているのは、現実の世界での怠zyな評価に対処することに関する本当に良い本です(これは学問の世界とそれほど違いはありません。ナイフで)それはこれに関連するほとんどの問題を適切にカバーし、さらに重要なことに、私たちの山を爆発させようとしていることとそうでないものを直感的に感じることです。
これは新しいことだとは思わない。他の言語やアーキテクチャもこれを経験していると確信しています。結局のところ、ハードウェアスタックなどを処理した最初のプログラマーはどのようにしていましたか?あまりよくない、私は賭けます。
ヤン・ウィレム・マエサンのものだと思います pHコンパイラ IS/厳格でした。次に最も近いのは、GHC 5のRobert Ennalの投機的評価フォークです。SPEC_EVALフォークは厳格ではありませんが、代わりに楽観的に評価します。どちらかがまだ最新/使いやすいかどうかはわかりません。
NFDATAとRNFをどこでも使用することは、すでに評価されている大きな構造を繰り返し横断することを意味するため、解決策ではありません。
Ben Lippmeierの博士論文(DDCについて)の紹介章は、私が見たHaskellの最高の批判についてです。それは怠laz、破壊的な更新、Monad Transformersなどの問題について議論しています。 、それは効果と見なされ、DDCのタイプと効果システムによって追跡および管理されています。
私は最近、この分野でいくつかの仕事を見ました:
https://ghc.haskell.org/trac/ghc/wiki/strictpragma
SPJのGHCステータスの更新で少し聞くことができます。
http://youtu.be/ex79k4lvjno?t=9m33s(リンクは9:33の関連する作品から始まります)
怠zyな評価ではなく、デフォルトで厳格な評価を使用するHaskellコンパイラを探しています。
このようなコンパイラは、Haskellコンパイラではありません。もし、あんたが 本当 欲しい、あなたは置くことを検討することができます {-# LANGUAGE Strict #-}
ファイルのプラグマ。これは、GHC 8.0.2、8.2.2、および8.4.1、つまりコンパイラの最後の3つのリリースで動作します。
また、特定の場所で怠zyな評価を使用する方法があれば役立ちます。
そのような方法はありません。代わりに、GHCを意図したとおりに使用します - 怠zyな言語として。コード、プロファイル、および機能データ構造を正しく使用することを学ぶことは、どこでも厳格さのプラグマを無意識に適用するよりもはるかに有用です。 GHCにはすでに厳格性アナライザーがあります。
(私はおそらく決してしません)。
それがまさにLLVM-HSの著者です 考え 彼らが怠zyなモナドではなく、厳格な状態のモナドを使用することを選んだとき。代わりに、それは道を予期しないバグを引き起こしました。怠lazと再帰は密接に関連しています。
怠zyな評価の方が良いと私に納得させようとしないでください、私は本当にパフォーマンスが必要です。
私はこれが実際には、Haskellコードのパフォーマンスを確実に向上させないと同時に、既存のコードを破壊し、既存のリソースを役に立たない場合に、実際にあなたが望むものです。これがプログラムを作成する方法である場合は、OCAMLまたはSCALAを使用して、Haskellコミュニティを放っておいてください。
IIRC、サイモン・ペイトン・ジョーンズは、怠zyな評価は本当に必要ではないとさえ言った。それは主に言語を不純にするのを防ぐためだった。
それは真実ではありません。 Haskellの実際の歴史については、詳細を読むことができます ここ
もあります seqaid, 、これは怠zyなスプリックスペクトルの真ん中を目指しています。
seqaidは、動的な厳格性(および並列性)制御のために、Haskellプロジェクトの非侵襲的な自動楽器を提供するGHCプラグインです。これには、最小限の固定化を使用した自動スペースリークリリーフの最適化がまもなく含まれます。
あなたは明らかに厳格な評価の価値について決心していますが、Haskellを使用するポイントを見逃していると思います。 Haskellの怠zyな評価により、コンパイラ/インタープリターでより柔軟な最適化戦略を採用することができます。独自の厳格さを強制すると、オプティマイザーが無効になります。最終的に、過度の厳格な評価を使用することは、自動化された最適化ほど効率的ではありません。 GHCIの一連の数字で、怠zyな評価なしで折りたたみ合計を試してください。違いを非常に明確に見ることができます。この場合、怠zyな評価は常に高速です。