Haskellで遅延評価をオフにすることは可能ですか?
これを容易にするためのライブラリの特定のコンパイラフラグはありますか?
しばらく前に書いた古いプログラムで何か新しいことを試して、パフォーマンスを改善できるかどうかを確認したかったのです。
Haskellで遅延評価をオフにすることは可能ですか?
これを容易にするためのライブラリの特定のコンパイラフラグはありますか?
しばらく前に書いた古いプログラムで何か新しいことを試して、パフォーマンスを改善できるかどうかを確認したかったのです。
怠惰なことを厳しくする方法はたくさんあります。あなたはできる:
seq
またはその近縁($!)
。BangPatterns
ます。詳細はこちら。
HaskellのI/Oシステムは怠惰に依存しているため、怠惰をオフにすることはできません。遅延評価がないと、このプログラムは何も出力せずにビジーループに陥ります。
main = forever (putStrLn "Hello!")
これは、forever c
が無限のプログラムであるためです。遅延評価では、プログラムは次の命令を実行するために必要な範囲でのみ計算されます。怠惰をオフにすると、を含むすべての関数が厳密になり、(>>)
基本的にforever
関数が発散します。
forever c = let cs = c >> cs in cs
ただし、コンストラクターとパターンに厳密性アノテーションを追加することはできます。関数が厳密である場合、引数が必要かどうかに関係なく、結果の評価の一部としてその引数が強制されます。これは、熱心な評価に似ています。
Daniel Wagnerがリストしたものに加えて、同様の質問を見てみたいと思うかもしれません。厳密な評価を使用するHaskellコンパイラまたはプリプロセッサはありますか?。
主な提案は、プロファイリングツールを使用し、Haskellをそのまま最適化する方法を学ぶことです。ただし、ほとんどの場合、厳密でない評価がオフになっている別の言語と見なされます。
pH( http://csg.csail.mit.edu/projects/languages/ph.shtml )と呼ばれるHaskellの変種があり、厳密ではないセマンティクスを提供しながら、熱心な評価を使用します。Haskell Reportは、厳密ではない言語であると注意深く述べています。怠惰は、非厳密性を説明し、明らかに実装するための明白な方法です。
したがって、「厳密でないセマンティクスを維持しながら、別の評価システムを使用できるか」という質問の場合は、pHを調べることができます。あなたの質問が「表面構文を共有しているがデフォルトで厳密なバージョンのHaskellはありますか?」である場合、それは他の答えでカバーされていると思います。
Strict
モジュールでプラグマを有効にすると、デフォルトですべてが厳密になります。
簡単な答えはノーです。より複雑な答えは、Haskellが関数を構築して評価する計算モデルが怠惰な方法で機能するということです。他の回答で読むように、いくつかの関数の評価を通常よりも早く強制する方法があり、そうすることは時々偶然です。しかし、正規形を持たない有効なHaskellの大部分があります。これには、IO機能と大量の標準プレリュードが含まれます。
結論:Haskellで遅延評価をオフにする方法はもうありません。Cでポインター演算をオフにする方法、またはRubyofJavaでOOをオフにする方法があります。この質問はあなたを連れて行くでしょうが、これはあなたよりはるかに遠いのではないかと思います。(--strict
モードはありません)が、ラビットの穴がどれだけ深くなっているのかを本当に知りたい場合は、Simon Peyton Jonesによる「ストックハードウェアへのレイジー関数型言語の実装:SpinelessTaglessG-machine 」は持つ価値のある冒険です。
strict-identity
パッケージには、厳密なバージョンのモナドIdentity
が含まれています。
あなたはここでそれを見つけることができます: https ://hackage.haskell.org/package/strict-identity
使用法は次のようになります。
foo = runStrictIdentity $! do
x <- f a b
y <- g x y
return $! x + y
return
またはバインドが使用されるたび>>=
に、2つの部分はを使用して評価seq
され、データ構造が深すぎない限り、厳密性が合理的に保証されます。これは、つまり数値と基本構造に対して機能します。