首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在调用递归内部函数时避免创建FSharpFunc的新实例?

如何在调用递归内部函数时避免创建FSharpFunc的新实例?
EN

Stack Overflow用户
提问于 2013-12-16 04:52:18
回答 1查看 152关注 0票数 2

示例:

代码语言:javascript
复制
let inline ReadState() = 

    let rec f (w : SpinWait) = 
        if (...) then
            w.SpinOnce()
            f(w)
        else
            result 

    f (new SpinWait())

使用ILSpy时,我注意到每次调用ReadState()都会创建FSharpFunc的新实例

代码语言:javascript
复制
new Memory@f222().Invoke()  // Memory@f222 implement FSharpFunc

如何避免呢?

如果是f not inner fun,那么no instance created,但是我需要另一个命名函数:

代码语言:javascript
复制
let rec InternalReadState(w : SpinWait) = .... 

let ReadState() = InternalReadState(new SpinWait())

不太美:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-16 15:47:02

在我看来,你有一些选择,但你可能对其中任何一个都不满意。最简单的方法是删除inline,然后将()参数移到嵌套函数之后:

代码语言:javascript
复制
let ReadState = 

    let rec f (w : SpinWait) = 
        if (...) then
            w.SpinOnce()
            f(w)
        else
            result 

    fun () -> f (new SpinWait())

您需要在这里删除inline,因为它只能应用于语法函数。

您的另一个选择是创建另一个命名函数,正如您注意到的那样。如果您担心不必要的命名函数会污染您的作用域,那么可以选择一些方法来减轻这种情况。您可以使用签名文件仅公开ReadState函数,也可以使用private修饰符使其在您所在范围之外的私有范围内:

代码语言:javascript
复制
module MyStuff =
    let rec private f (w:SpinWait) = ...
    let inline ReadState() = f (new SpinWait())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20603696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档