0

関数があるとしましょう

type Func = Bool -> SophisticatedData
fun1 :: Func

そして、この関数の入力を変更したいと思います:

change :: SophisticatedData -> Func -> Func
change data func = \input -> if input == False then data else func input

change( )を数回呼び出した後、endFunc = change data1 $ change data2 $ startFunc結果の関数が毎回すべての中間関数を呼び出すというのは正しいですか? GC が未使用のデータを削除できないというのは正しいですか? このタスクに対処するための Haskell の方法は何ですか?

ありがとう。

4

2 に答える 2

1

あなたは正しいです: がfooへの O(n) 呼び出しのチェーンである場合、 へchangeの呼び出しごとに O(n) オーバーヘッドが発生しますfoo。これに対処する方法は memoizefooです:

memoize :: Func -> Func
memoize f = \x -> if x then fTrue else fFalse where
    fTrue  = f True
    fFalse = f False
于 2013-10-21T20:51:46.847 に答える