1

たとえば、メモ化のために、F#でゼロパラメーター関数の値ではなく関数自体を取得する必要がある場合があります。つまり、私はこれを持っています:

let memoize (f: 'a -> 'b) =
    let dict = new Dictionary<'a, 'b>()
    let memoizedFunc (input: 'a) =
        match dict.TryGetValue(input) with
        | true, x -> x
        | false, _ ->
            let answer = f input
            dict.Add(input, answer)
            answer
    memoizedFunc

これは完全に機能しますが、今では次の機能があります。

let private getDataSlowOperation =
    // implementation

そして、それをメモ化しようとすると、型の不一致(基本的にはの戻り型getDataSlowOperationと型の間の不一致'a)が発生します。次のように関数を変更することでこれを解決できます。

let private getDataSlowOperation bogus =
    // implementation

これで機能しますが、メモ化を機能させるために関数のシグネチャを変更する必要があるのは奇妙に思えます。

let memoGetDataSlowOperation = memoize getDataSlowOperation

インライン宣言を試しましfunたが、もちろん、これにより新しい無名関数が作成され、メモ化は機能しません。これを解決する方法はありますか?忘れてしまったキーワード/演算子はありますか?

4

1 に答える 1

9

あなたが定義したのは関数ではなく、単なる値です。

関数として定義するには、次のように記述します。

let private getDataSlowOperation() =
    // implementation


アップデート

議論を要約すると:

  • これは関数として記述する正しい方法ですが、コードはまだ機能しませんが、それは別の問題です。

  • キーに使用できないディクショナリに()コンパイルされ、それを使用するため、コードは実行時に失敗します。代わりにマップを使用できます。nullnull

  • John は、パラメータのない関数のメモ化は無意味だと指摘しましたが、私も同意します。

  • それでも、パラメータを持つ関数に Dictionary を使用すると、 にコンパイルされる値で同じ問題が発生しますnull。つまり、次のようになります。None

于 2013-01-02T13:29:57.373 に答える