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

Abe*_*bel 1 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
Run Code Online (Sandbox Code Playgroud)

这很好用,但现在我有以下功能:

let private getDataSlowOperation =
    // implementation
Run Code Online (Sandbox Code Playgroud)

当我试图记住它时,它会给出类型不匹配(实质上是返回类型getDataSlowOperation'a类型之间的不匹配).我可以通过更改函数来解决这个问题,如下所示:

let private getDataSlowOperation bogus =
    // implementation
Run Code Online (Sandbox Code Playgroud)

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

let memoGetDataSlowOperation = memoize getDataSlowOperation
Run Code Online (Sandbox Code Playgroud)

我已经尝试了内联fun声明,但这会创建一个新的匿名函数,并且memoization不能用于此.任何想法如何解决这个问题?我忘了的任何关键字/运营商?

Gus*_*Gus 9

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

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

let private getDataSlowOperation() =
    // implementation
Run Code Online (Sandbox Code Playgroud)


UPDATE

总结一下讨论:

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

  • 代码在运行时会失败,因为()编译到null并使用不能null用于Key 的Dictionary .您可以改用地图.

  • 约翰指出,没有参数的函数的记忆没有意义,我同意.

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