与计算表达式的相互递归

Fri*_*etz 3 f#

目前我有以下结构:

let rec foo x = State.state{
    let rec bar =
        //...
        foo 5
        //...
    //...
    bar
    //...
}
Run Code Online (Sandbox Code Playgroud)

我想提取'bar'函数并获得如下结构:

let rec foo x = State.state{
    //...
    bar
    //...
}
and bar =  State.state{
    //...
    foo 5
    //...
}
Run Code Online (Sandbox Code Playgroud)

这将允许我有另一个函数foo2,它也可以使用bar并避免代码重复.

问题是:我的提案没有在F#中编译,显然这是因为State上下文.那么达到所需代码结构的语法正确方法是什么?

erd*_*szt 5

这对我来说很好:

let rec foo x = 
  async {
    return! bar x
  }
and bar x = 
  async {
    if x = 0
      then printfn "bar"
      else do! foo (x - 1) 
  }
Async.RunSynchronously (foo 10)
Run Code Online (Sandbox Code Playgroud)

我首先遇到格式化问题,因此请确保您的缩进正确并且您的感叹号位于正确的位置,否则类型将无法解决.