5

私はパイプライブラリのソースコードを見ています。たとえば、コアモジュールでは、作者がそのような関数を定義するパターンを使用してあちこちにいる理由がわかりません:

runEffect = go
  where
    go p = ...

または:

pull = go
  where
    go a' = ...

または:

reflect = go
  where
    go p = ...

これは、いくつかの最適化を有効にするためのトリックですか? それが最適化のトリックである場合、コンパイラがそのようなことなしにそれを実行できることを本当に望んでいます。でも、もしかしたら別の理由があるのでは?

4

1 に答える 1

7

GHC は非再帰関数のみをインライン展開し、それらが構文の観点から「完全に適用された」場合にのみ (つまり、呼び出しサイトでは、定義の左側に現れる引数の数に適用されます)。

投稿した例には引数はありませんが、定義は再帰的である可能性が高く、インライン化されません。この変換を行うと、おそらくm呼び出しサイトで定義をインライン化して特殊化することができます (具体的な型など)。

これは、いくつかの最適化を有効にするためのトリックですか? それが最適化のトリックである場合、コンパイラがそのようなことなしにそれを実行できることを本当に望んでいます。

ええ、それは非常に不自由です。

于 2015-07-01T18:33:00.943 に答える