Haskell で配列を使用したキャッシング (メモ化) の実装について質問があります。次のパターンが機能します。
f = (fA !)
where fA = listArray...
しかし、これはそうではありません(プログラムの速度は、呼び出しごとに配列が再作成されていることを示唆しています):
f n = (fA ! n)
where fA = listArray...
where句の外側(「グローバルスコープ」内)でfAを定義することも、どちらのパターンでも機能します。
上記の 2 つのパターンの違いについて、誰かが技術的な説明をしてくれることを期待していました。
私は最新の GHC を使用していることに注意してください。これが単なるコンパイラの特性なのか、それとも言語自体の一部なのかはわかりません。
編集: !は配列アクセスに使用されるため、 fA ! 5 は、C++ 構文の fA[5] を意味します。Haskell についての私の理解では、(fA !) n は (fA ! n) と同じであるということです...また、"fn = fA ! n" (括弧なし) と書く方がより一般的でした。とにかく、どのように括弧を付けても同じ動作になります。