f# - 与计算表达式的相互递归

标签 f#

目前我有以下结构:

let rec foo x = State.state{
    let rec bar =
        //...
        foo 5
        //...
    //...
    bar
    //...
}

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

let rec foo x = State.state{
    //...
    bar
    //...
}
and bar =  State.state{
    //...
    foo 5
    //...
}

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

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

最佳答案

这对我来说很好:

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)

我首先遇到了格式方面的问题,因此请确保缩进正确并且感叹号位于正确的位置,否则类型将无法正常工作。

关于f# - 与计算表达式的相互递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37920954/

相关文章:

.net - 以函数式方法解决继承依赖

f# - 如何在 F# 中对 LIST 进行排序

asp.net - 如何将基于 .fsproj 的 f# 项目 git 部署到 azure?

F# TypeInitializationException 解析 Json 文件时抛出

syntax - 为什么将表达式的第一行与 let 放在同一行无法编译?

recursion - 具有递归的 F# 求和类型?

types - F#中自然数的类型级编码

f# - 在 F# 序列开头添加元素的更好方法

Emacs专家: is possible connect f# intellisense command line tool with emacs?

f# - 你如何定义这个静态解析的类型参数?