是否可以使用连续传递样式将此递归函数转换为尾递归函数?

2024-04-05

我最近写了一个ETL,效果很好。 我想提醒自己如何使用免费的 monad,因此想将我的 ETL 转换为这样的。 注意:我的目的不是写一个更好的 ETL,而是让自己重新熟悉免费的 monad。在重新学习自由单子如何工作时,我偏离了这个问题的主题。

所以我问了一个相关问题 https://stackoverflow.com/questions/50411886/does-using-a-free-monad-in-f-imply-a-higher-startup-time-and-limited-instructio几个月前。有人评论说我的递归函数可以使用连续传递风格进行尾递归。我不知道该怎么做。

一些示例代码:

type In1 = int
type In2 = int
type Out1 = int
type Out2 = int

type FaceInstruction<'a> =
| Member1 of (In1 * (Out1 -> 'a))
| Member2 of (In2 * (Out2 -> 'a))

let private mapI f = function
    | Member1 (x, next) -> Member1 (x, next >> f)
    | Member2 (x, next) -> Member2 (x, next >> f)

type FaceProgram<'a> =
| Free of FaceInstruction<FaceProgram<'a>>
| Pure of 'a

let rec bind f = function
| Free x -> x |> mapI (bind f) |> Free
| Pure x -> f x

我试图使尾递归的函数是bind

我的尝试看起来像

let rec bind2 (f: 'a -> FaceProgram<'b>) k  z : FaceProgram<'b> = 
    match z with
    |Pure x -> x |> f |> k
    |Free x -> bind2 ???

我开始认为,事实上,不可能使这个尾部递归。方式FaceInstruction<'a>已经包含了一个延续,并且函数mapI修改该延续,所以现在尝试添加另一个延续k这是我现在无法处理的两个延续之一!


事实上bind实际上并不是一个递归函数,因为在堆栈中永远不会有多个调用bind在任何给定时间。

原因是因为两者都不bind nor mapI call bind。请注意它们是如何立即退出而不深入堆栈的。bind calls mapI but mapI根本不调用任何函数(除了Member1 or Member2它们是构造函数)。他们所做的是使用以下命令编写一个新的 Free monad 实例bind and next. bind必须声明为rec因为它需要一个自引用来将自身作为参数传递给mapI.

需要将解释器实现为尾递归,这应该不会太困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用连续传递样式将此递归函数转换为尾递归函数? 的相关文章

  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 如何在 F# 中捕获任何异常(System.Exception)而不发出警告?

    我试图捕获异常 但编译器给出警告 此类型测试或向下转型将始终保持 let testFail try printfn Ready for failing failwith Fails with System ArgumentException
  • 如何用模板参数包的内容填充数组?

    我嵌套了与 VS 2015 一起使用的部分专用模板代码 直到我发现它不符合标准 https stackoverflow com q 3052579 2747466 我希望如此 所以我扭曲了我的代码来克服前一个问题 并且that one ht
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind
  • 跟踪 C++ 中递归函数被调用的次数

    我正在尝试编写一个程序 该程序具有一个参数是字符串向量的函数 我想在该函数上使用递归 但每次调用该函数时 我想更改参数 例如 fun stringArray i 其中 i 是调用该函数的次数 因此 以更简单的方式 如下所示 但我需要跟踪函数
  • 将 Foq 与 F# 函数类型结合使用

    例如 我使用 F 类型定义来防止函数之间的硬依赖 type IType1 int gt int type IType2 int gt string let func1 i int int i i let func2 i int string
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • 如何返回n对括号的所有有效组合?

    def paren n lst for x in range n current string join lst solutions list for i in range len current string 1 close curren
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • Python最大递归,关于sys.setrecursionlimit()的问题

    我有一个问题sys setrecursionlimit 来自蟒蛇docs https docs python org 2 library sys html sys setrecursionlimit这个函数 将Python解释器堆栈的最大深
  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 需要使用 pyparsing 制作递归解析器的帮助

    我正在尝试使用 python pyparsing 进行解析 我在制作递归解析器时陷入困境 让我解释一下问题 我想要计算元素的笛卡尔积 语法是 cross elements element 我用更具体的方式 cross a c1 or cro
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来

随机推荐

  • 如何将参数从一个项目传递到另一个项目?

    截至所附屏幕截图 我有 4 个 Rest API 项目 我需要将生成的用户 ID 从项目 1 1 管理基础知识和获取 API 传递到其他项目 2 课程和课程 我正在使用测试运行程序运行每个项目 全局财产转移在这种情况下不起作用 有人可以帮我
  • jQuery ajax 和 SSL?

    在我们的网站中 某些页面使用 SSL 但大多数页面没有 因为它们需要由网络机器人抓取 它几乎可以归结为用户登录的任何页面 除了少数例外是在 SSL 下 但用户首先必须从非 https 页面登录 登录表单是从任何页面屏幕顶部掉落的表单 So
  • 如何将materialButton图标设置到中心

    我在用supportLibrary 28 0 0 beta01 版本 这是我在 xml 文件中的代码
  • Vim 折叠:如何隐藏所有不包含搜索模式的单行(或折叠零行)?

    我有一些文本文件 它们只是没有段落的列表 当我想专注于某个项目时 我可以折叠除搜索匹配项之外的所有内容 这要归功于 Vim Wikia 提示 282 简单折叠 set foldexpr getline v lnum nnoremap
  • Web 声卡检测

    我们需要一些关于业余爱好网络项目的提示 在此阶段 我们要检测客户端的声卡并将来自声卡的任何内容引导到服务器以处理音频 低延迟对我们来说是一个重要问题 因此 我们需要您对使用的语言 库等的建议 如果你能给我们一些大局的信息 那么我们就可以自己
  • git 报告合并冲突,没有任何更改,空行(使用 git-subtree)

    我正在测试使用git 子树 https github com apenwarr git subtree将库存储库合并到更大的项目中 原则上看起来很棒 有时 当我执行 git subtree pull 时 我会遇到如下合并冲突 lt lt l
  • Windows 7 .net Excel .SaveAs() HRESULT 错误异常:0x800A03EC

    背景 我在工作中为我的旧硬盘干杯 现在正在买一个新硬盘 这样我就必须重建我的机器 我的经理在他借用的笔记本电脑上安装了 Windows 7 在我的机器无法使用时我一直在使用这台笔记本电脑 但我遇到了一个问题 我们有相当多的应用程序使用 Mi
  • 我可以使用 git 提交文件,但在执行 git svn dcommit 时自动忽略它吗?

    我现在开始在 SVN 办公室采用 Git 作为我的个人工作流程 因此 git svn 是我将严重依赖的工具 我遇到的一个我不知道如何解决的问题是如何在一个方向上忽略 对我来说 具体的用例是我们的 ant 构建文件引用 svn 和 svnve
  • 具有相同列和索引的多个数据帧的平均值

    我有一些数据框 它们每个都有相同的列和相同的索引 对于每个索引 我想对每列中的值进行平均 如果这些是矩阵 我只需将它们相加并除以矩阵数量 这是一个例子 v1 pd DataFrame ind1 1 2 3 ind2 4 5 6 column
  • 适用于 Mac 的 C IDE 好用吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚开始在 Mac 上用 C 进行编程的工作 这是我第一次使用 Mac 进行开发 现在我使用 Xcode 作为编辑器 然后在命令行中使用
  • React-native 和 React

    我正在构建一个网络应用程序和 ios android 相同的应用程序 起初我认为 Cordova 可能是一个不错的选择 但读完之后我认为 React native 可能是一个更好的选择 我的问题是 我是否必须编写同一个应用程序两次 一次在
  • #include 导致错误

    VS 2010 C CLR 库项目 添加 comutil h 库时出错 gt Error 20 error LNK2001 unresolved gt external symbol extern C long gt stdcall Var
  • PostgreSQL - 动态值作为表名[重复]

    这个问题在这里已经有答案了 可能的重复 Postgres动态查询功能 https stackoverflow com questions 10639963 postgres dynamic query function 我希望使用下面的查询
  • 如何确定 Pandas 列是否包含特定值

    我试图确定 Pandas 列中是否有具有特定值的条目 我尝试这样做if x in df id 我认为这是有效的 除非我给它提供了一个我知道不在列中的值43 in df id 它仍然返回True 当我子集为仅包含与缺少的 id 匹配的条目的数
  • 服务器删除自定义 HTTP 标头字段

    我一直在尝试接收标头中带有自定义字段的 HTTP 请求 但似乎我的服务器删除了它们 这是我发送到服务器的请求 我使用 HTTP 代理读取该请求 POST oauth php request token HTTP 1 1 Host domai
  • Xbox 上的 UWP 应用

    在围绕 Windows 10 的活动和促销期间 我总是看到 UWP 应用程序可以在 Microsoft 系列的所有设备上运行 为了确认这一点 当我在浏览器上浏览 UWP 应用程序并单击以查看应用程序页面的源代码时 我能够看到以下元数据 那
  • MPAndroidChart:带有三次贝塞尔曲线的折线图显示错误(尖峰和循环)

    我正在尝试制作带有立方图的折线图 结果如下面的屏幕截图所示 三次贝塞尔曲线显示错误并且有 尖峰 有人可以帮我让它正确显示吗 这是我的配置 LineDataSet lineDataSet new LineDataSet entries nam
  • 如何更新 xml 文件而不将整个文件加载到内存中

    我们如何更新 xml 文件而不将其完全加载到内存中 在下面的代码中 我想浏览每个父节点注释并更新 to 节点的值 我们如何使用 C 来实现这一点 我必须根据代码中的其他一些计算来更新 to 字段
  • 以编程方式连接两个子系统

    我正在尝试以编程方式重用我之前开发的一些自定义块 模型来构建一个复杂的模型 但我无法设法连接两个 PMC Port 这就是我所拥有的 Main system sys name model sys new system sys name op
  • 是否可以使用连续传递样式将此递归函数转换为尾递归函数?

    我最近写了一个ETL 效果很好 我想提醒自己如何使用免费的 monad 因此想将我的 ETL 转换为这样的 注意 我的目的不是写一个更好的 ETL 而是让自己重新熟悉免费的 monad 在重新学习自由单子如何工作时 我偏离了这个问题的主题