19

Haskellで遅延評価をオフにすることは可能ですか?

これを容易にするためのライブラリの特定のコンパイラフラグはありますか?

しばらく前に書いた古いプログラムで何か新しいことを試して、パフォーマンスを改善できるかどうかを確認したかったのです。

4

7 に答える 7

36

怠惰なことを厳しくする方法はたくさんあります。あなたはできる:

  1. 偽のパターンマッチを明示的に挿入します。
  2. 使用seqまたはその近縁($!)
  3. を使用しBangPatternsます。
  4. タイプに厳密性アノテーションを使用します。

詳細はこちら

于 2013-03-26T01:55:07.667 に答える
17

HaskellのI/Oシステムは怠惰に依存しているため、怠惰をオフにすることはできません。遅延評価がないと、このプログラムは何も出力せずにビジーループに陥ります。

main = forever (putStrLn "Hello!")

これは、forever cが無限のプログラムであるためです。遅延評価では、プログラムは次の命令を実行するために必要な範囲でのみ計算されます。怠惰をオフにすると、を含むすべての関数が厳密になり、(>>)基本的にforever関数が発散します。

forever c = let cs = c >> cs in cs

ただし、コンストラクターとパターンに厳密性アノテーションを追加することはできます。関数が厳密である場合、引数が必要かどうかに関係なく、結果の評価の一部としてその引数が強制されます。これは、熱心な評価に似ています。

于 2013-03-26T01:59:28.650 に答える
11

Daniel Wagnerがリストしたものに加えて、同様の質問を見てみたいと思うかもしれません。厳密な評価を使用するHaskellコンパイラまたはプリプロセッサはありますか?

  • 答えには、haskellの厳密なバージョンを明示的に怠惰なものにしようとするDDCコンパイラが含まれます
  • monad.reader12で説明されているghcプラグイン
  • 「どこでもnfdataとrnfを使用する」-solrize
  • もっと

主な提案は、プロファイリングツールを使用し、Haskellをそのまま最適化する方法を学ぶことです。ただし、ほとんどの場合、厳密でない評価がオフになっている別の言語と見なされます。

于 2013-03-26T02:04:23.373 に答える
6

pH( http://csg.csail.mit.edu/projects/languages/ph.shtml )と呼ばれるHaskellの変種があり、厳密ではないセマンティクスを提供しながら、熱心な評価を使用します。Haskell Reportは、厳密ではない言語であると注意深く述べています。怠惰は、非厳密性を説明し、明らかに実装するための明白な方法です。

したがって、「厳密でないセマンティクスを維持しながら、別の評価システムを使用できるか」という質問の場合は、pHを調べることができます。あなたの質問が「表面構文を共有しているがデフォルトで厳密なバージョンのHaskellはありますか?」である場合、それは他の答えでカバーされていると思います。

于 2013-03-27T02:45:41.500 に答える
5

Strictモジュールでプラグマを有効にすると、デフォルトですべてが厳密になります。

https://ghc.haskell.org/trac/ghc/wiki/StrictPragma

于 2016-09-07T16:57:49.927 に答える
3

簡単な答えはノーです。より複雑な答えは、Haskellが関数を構築して評価する計算モデルが怠惰な方法で機能するということです。他の回答で読むように、いくつかの関数の評価を通常よりも早く強制する方法があり、そうすることは時々偶然です。しかし、正規形を持たない有効なHaskellの大部分があります。これには、IO機能と大量の標準プレリュードが含まれます。

結論:Haskellで遅延評価をオフにする方法はもうありません。Cでポインター演算をオフにする方法、またはRubyofJavaでOOをオフにする方法があります。この質問はあなたを連れて行くでしょうが、これはあなたよりはるかに遠いのではないかと思います。(--strictモードはありません)が、ラビットの穴がどれだけ深くなっているのかを本当に知りたい場合は、Simon Peyton Jonesによる「ストックハードウェアへのレイジー関数型言語の実装:SpinelessTaglessG-machine 」は持つ価値のある冒険です。

于 2013-03-26T06:35:42.427 に答える
2

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され、データ構造が深すぎない限り、厳密性が合理的に保証されます。これは、つまり数値と基本構造に対して機能します。

于 2014-02-08T08:39:32.823 に答える