関数型プログラミング言語Haskell Part23
■ このスレッドは過去ログ倉庫に格納されています
0447デフォルトの名無しさん
2013/09/24(火) 18:35:58.56残念ながら、どんな場合でも使えるメモ化方法はHaskellにはない
やり方は大きく分けて二つ
1. あらゆる引数に対応する戻り値を含む遅延データ構造を作る
2. メモ表を状態と捉えて、明示的に更新する
(1)の例
f_memo :: [Int]
f_memo = map (\x -> x * 2) [0..]
f x = f_memo !! x
この例は引数がたまたまInt一つ(で、負の数を無視した)から無限リストにできたけど、
一般の場合にはMemoTrieみたいなのを使う
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/MemoTrie
欠点は、引数の型が(要するに)[Bool]にエンコードできる必要があること
(OrdやHashableでは足りない)
(2)は、具体的にどうやって状態を扱うかによっていろいろ
Stateモナドを使ったり、IORefを使ったり
欠点は、論理的に必要ないのにモナドを使わざるを得ないことと、書くのが面倒なこと
■ このスレッドは過去ログ倉庫に格納されています