我有时需要在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不能用于此。任何想法如何解决这个问题?我忘了的任何关键字/运营商?
答案 0 :(得分:9)
你定义的不是一个函数,它只是一个值。
为了将其定义为函数,您可以写下:
let private getDataSlowOperation() =
// implementation
的更新强>
总结讨论:
这是将其编写为函数的正确方法,但代码仍然不起作用,但这是一个不同的问题。
代码在运行时会失败,因为()
已编译为null
,而使用词典时,您无法使用null
作为密钥。您可以改为使用地图。
John指出,没有参数的函数的记忆没有意义,我同意。
但是,如果对带参数的函数使用Dictionary,则会遇到与编译为null
的值相同的问题,即:None