如何获取对不带F#参数的函数的引用?

时间:2013-01-02 13:24:26

标签: f# functional-programming memoization f#-3.0

我有时需要在F#中获取零参数函数本身的函数,而不是值,例如用于memoization。即,我有这个:

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声明,但这会创建一个新的匿名函数,并且memoization不能用于此。任何想法如何解决这个问题?我忘了的任何关键字/运营商?

1 个答案:

答案 0 :(得分:9)

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

为了将其定义为函数,您可以写下:

let private getDataSlowOperation() =
    // implementation


更新

总结讨论:

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

  • 代码在运行时会失败,因为()已编译为null,而使用词典时,您无法使用null作为密钥。您可以改为使用地图。

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

  • 但是,如果对带参数的函数使用Dictionary,则会遇到与编译为null的值相同的问题,即:None