2017-06-10 13 views
1

ただ、一般的な質問:関数の結果を保存するには?

私は(そのことについては、一般的にプログラミングに)Haskellのにかなり新しいですし、私はどんなに多くの場合、その関数の結果を保存しないことが可能である方法を知りたいです機能が実行されます。関数を実行すると、結果をどこかに保存して、さまざまなパラメータで関数を呼び出す頻度にかかわらず、以前のすべての結果にアクセスできます。

ご協力いただければ幸いです。

+1

どのように以前の結果にアクセスできますか? –

+0

'Control.Monad.Trans.State'を見てください。あなたが尋ねたことはまったく行いませんが、おそらくあなたが望むものだと思います。 – dfeuer

+0

[Memoization in Haskellの複製](https://stackoverflow.com/questions/3208258/memoization-in-haskell) – jberryman

答えて

2

私はあなたが求めているものは、どのようにmemoise関数です。 Memoisationとは、ある引数(おそらく高価な)がある引数で評価された後、同じ引数で再度評価されるときに、プロセッサは実際にはすべての計算をやり直す必要はなく、結果を参照するだけですある種のテーブルで

これを実行するための単純なライブラリがあります。 MemoTrieでは:今、あなたは2回連続f 0を呼び出す場合

import Data.MemoTrie 

f :: Int -> Int 
f x = ... -- some expensive computation 

fm :: Int -> Int 
fm = memo f 

、それは二回終了するのに長いを過ごすことになります。 OTOH、fm 0は最初の時間が長くかかるだけで、2回目はすぐに結果が得られます。

あなたが唯一fがmemoised使用したい知っている場合は、すぐにそれをこのように定義することができます。

f :: Int -> Int 
f = memo $ \x -> ... 

Int -> Intは一例の署名です。そのような関数の結果はあなたが望む任意の型を持つことができ、引数はかなり "離散"型(任意の整数、タプル、文字列など)でもかまいません。


MemoTrie、ほとんどこのようなライブラリーのように、唯一のRAMに結果を保存します。だからあなたのプログラムが存在し、それを完全に新しいものにすると、メモの結果はなくなり、結局は新たに計算する必要があります。結果をに保存し続けると、がより関わっています。私は自動でこれを行うライブラリを認識していません。少し問題があるのは、引数がすでに試されている状態は、実際にはHaskellのセマンティクスの一部ではないということです。

最近、私は非常に関連性の高いプロジェクトを手がけました。

https://github.com/leftaroundabout/lazy-hash

関連する問題