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

现在这可行,但是必须更改函数签名才能使 memoization 工作似乎很奇怪:

let memoGetDataSlowOperation = memoize getDataSlowOperation

我已经尝试过内联fun声明,但这当然会创建一个新的匿名函数,并且记忆化不适用于它。任何想法如何解决这个问题?我忘记了任何关键字/运算符吗?

4

1 回答 1

9

你定义的不是一个函数,它只是一个值。

为了将它定义为一个函数,你可以这样写:

let private getDataSlowOperation() =
    // implementation


更新

总结讨论:

  • 这是将其编写为函数的正确方法,但是代码仍然无法工作,但这是一个不同的问题。

  • 代码将在运行时失败,因为()编译为null并使用不能null用于键的字典。您可以改用地图。

  • John 指出,没有参数的函数的记忆是没有意义的,我同意。

  • 尽管如此,如果您将 Dictionary 用于带参数的函数,您将遇到与编译为 的值相同的问题null,即:None

于 2013-01-02T13:29:57.373 回答