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不能用于此.任何想法如何解决这个问题?我忘了的任何关键字/运营商?
你定义的不是一个函数,它只是一个值.
为了将其定义为函数,您可以这样写:
let private getDataSlowOperation() =
// implementation
Run Code Online (Sandbox Code Playgroud)
UPDATE
总结一下讨论:
这是将其作为函数编写的正确方法,但是代码仍然不起作用,但这是一个不同的问题.
代码在运行时会失败,因为()编译到null并使用不能null用于Key 的Dictionary .您可以改用地图.
约翰指出,没有参数的函数的记忆没有意义,我同意.
尽管如此,如果对带参数的函数使用Dictionary,则会遇到与编译到的值相同的问题null,即:None
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |