在 scala 中使用 FoldRight 进行 FoldLeft

2023-12-29

在经历的同时Scala 中的函数式编程 http://www.manning.com/bjarnason/,我遇到了这个问题:

你能用foldRight 来右转foldLeft 吗?另一种方式怎么样 大约?

在作者提供的解决方案中,他们提供了如下实现:

def foldRightViaFoldLeft_1[A,B](l: List[A], z: B)(f: (A,B) => B): B = 
    foldLeft(l, (b:B) => b)((g,a) => b => g(f(a,b)))(z)

  def foldLeftViaFoldRight[A,B](l: List[A], z: B)(f: (B,A) => B): B = 
    foldRight(l, (b:B) => b)((a,g) => b => g(f(b,a)))(z)

有人可以帮我追踪这个解决方案,让我理解这实际上是如何根据foldr实现foldl的,反之亦然吗?

Thanks


我们来看看

def foldLeftViaFoldRight[A,B](l: List[A], z: B)(f: (B,A) => B): B = 
  foldRight(l, (b:B) => b)((a,g) => b => g(f(b,a)))(z)

(另一个折叠类似)。诀窍在于,在正确的折叠操作期间,我们不会构建类型的最终值B。相反,我们构建一个函数B to B。折叠步骤采用 type 的值a: A和一个函数g: B => B并产生一个新函数(b => g(f(b,a))): B => B。该函数可以表示为以下的组合g with f(_, a):

  l.foldRight(identity _)((a,g) => g compose (b => f(b,a)))(z);

我们可以这样看待这个过程: 对于每个元素a of l我们采取部分申请b => f(b,a),这是一个函数B => B。然后我们compose https://en.wikipedia.org/wiki/Function_composition所有这些函数都以这样的方式进行:与最右边的元素(我们开始遍历)相对应的函数位于组合链的最左边。最后,我们将大组合函数应用到z。这会产生一系列操作,从最左边的元素(位于组合链的最右边)开始,到最右边的元素结束。

Update:作为一个例子,我们来看看这个定义如何在二元素列表上工作。首先,我们将函数重写为

def foldLeftViaFoldRight[A,B](l: List[A], z: B)
                             (f: (B,A) => B): B =
{
  def h(a: A, g: B => B): (B => B) =
    g compose ((x: B) => f(x,a));
  l.foldRight(identity[B] _)(h _)(z);
}

现在让我们计算一下当我们通过它时会发生什么List(1,2):

List(1,2).foldRight(identity[B] _)(h _)
  = // by the definition of the right fold
h(1, h(2, identity([B])))
  = // expand the inner `h`
h(1, identity[B] compose ((x: B) => f(x, 2)))
  =
h(1, ((x: B) => f(x, 2)))
  = // expand the other `h`
((x: B) => f(x, 2)) compose ((x: B) => f(x, 1))
  = // by the definition of function composition
(y: B) => f(f(y, 1), 2)

将此功能应用到z yields

f(f(z, 1), 2)

按要求。

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

在 scala 中使用 FoldRight 进行 FoldLeft 的相关文章

  • Scala:如何将“MatchesRegex”细化与包含反引号的正则表达式(细化库)一起使用?

    The refined https github com fthomas refined库允许定义与给定匹配的细化regex 如图所示Readme import eu timepit refined import eu timepit re
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 计算行的排名

    我想根据一个字段对用户 ID 进行排名 对于相同的字段值 排名应该相同 该数据位于 Hive 表中 e g user value a 5 b 10 c 5 d 6 Rank a 1 c 1 d 3 b 4 我怎样才能做到这一点 可以使用ra
  • Scala 和 Spark:Windows 上的 Dataframe.write._

    有人设法使用 Spark 写入文件 尤其是 CSV 吗 数据框 http spark apache org docs latest api scala index html org apache spark sql Dataset在 Win
  • 将元组划分为多个元组的类型安全方法

    我们有一个特征 除其他外 还包含execute T lt Record Seq Session gt T Seq T 方法 其中Record是我们从数据库中检索的所有特征的超级特征 trait DbTrait val threadCount
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • 为什么不重新评估 Binding.scala 路由器?

    我正在尝试通过 Binding scala 为个人项目构建通用路由器 我定义了一个PageState trait sealed trait WhistState def text String def hash String def ren
  • Scala 方法和高级类型参数

    我试图在 scala 中定义一个方法 它采用通用类型S lt Seq Double 并返回一个 S FixedLoad FixedLoad 是一个具体类型 但我的实现给了我错误 我不明白为什么 尽管我多次尝试去理解参数类型和高级类型 但我的
  • 如何从命令行运行scala文件?

    scala是否支持scala run xxx scala go语言支持这样运行 go my go 并且Python支持 python my py 但看来 scala xxx scala 仅进行语法检查 未观察到任何输出或运行行为 那么有没有
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • 实现一个scala集合,以便map、filter等产生正确的类型

    我正在尝试实施一个默认值映射 https stackoverflow com questions 3187411 designing a convenient default valued map in scala 我想要过滤器 地图等De
  • 结构化 scala 案例类的自定义 json 序列化

    我有一些用于往返 scala 案例类的工作 jackson scala 模块代码 Jackson 对于平面案例类非常有用 但是当我制作一个包含其他案例类列表的案例时 我似乎需要很多代码 考虑 abstract class Message c
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • 覆盖 Predef 的隐式转换

    我有多个返回 java lang Integer 的方法 然后使用 Scala 的 Predef 隐式转换将其隐式转换为 Int 下面是它的编写方式there https github com scala scala blob v2 11
  • Scala 中奇怪的类型不匹配

    我希望这个问题还没有在其他地方得到解答 在这里没有找到答案 在我的本地化系统中 我有一个名为 Language 的类 class Language val name String dict HashMap String String def
  • GLSL 中的二阶函数?

    我正在寻找一种方法来使用一个函数作为 GLSL 中另一个函数的参数 在常规 C 中 可以通过传递函数指针作为函数参数来模拟它 似乎其他语言 如 HLSL 现在提供了处理高级构造 如高阶函数 的方法 或者可以使用以下命令来模拟它们巧妙利用 H
  • Scala REPL 中的递归重载语义 - JVM 语言

    使用 Scala 的命令行 REPL def foo x Int Unit def foo x String Unit println foo 2 gives error type mismatch found Int 2 required

随机推荐

  • 安装/捆绑 gem unf_ext -v '0.0.6' 时出错

    我正在尝试捆绑安装unf ext v 0 0 6 但我不断收到此错误 Gem Ext BuildError ERROR Failed to build gem native extension checking for main in ls
  • NodeJS Google Vision 无法检测当前环境中的项目 ID

    Ubuntu环境下 NodeJS Google Vision抱怨 Error 无法在当前环境中检测到项目 ID 即使我已经通过了 json 凭证 export GOOGLE APPLICATION CREDENTIALS var crede
  • pgAdmin 执行脚本的快捷方式

    谁知道 pgAdmin 查询工具中执行脚本的快捷方式 即执行整个查询并执行当前脚本 Select the relevant portion and hit the F5 key in the SQL editor of pgAdmin OR
  • vxworks 中的 C++ 11

    我是VxWorks的新手 我正在VxWorks平台上使用C 开发一个软件 我想知道VxWorks编译器是否支持C 11标准 我问这个问题的原因是因为没有可用的shrink to fit std vector 函数 该函数是在c 11 标准中
  • cvc-complex-type.3.2.2:属性 xsi:schemaLocation 不允许出现在 Java DOM 中的

    我正在尝试使用 DOM 验证器在 Java 中使用 XSD 来验证我的 XML 尽管我手动知道该文档确实有效 但 DOM 验证器却对我喊道 cvc complex type 3 2 2 Attribute
  • 优化自由 Monad

    如果我有一个价值a Free Op A 是否有可能 扁平化 结构a这样两个Op被自由单子束缚在一起的 s 可以折叠成一个吗 Context 我想在解释之前执行此操作作为优化步骤 因为语义Op是它的操作是幂等的 因此 如果两个 连续 出现 则
  • Android 如何使用location.distanceTo()

    我正在使用片段 我需要获取当前位置 纬度和经度 我需要用目的地位置来计算我当前的位置 你能帮我一下吗 计算位置的最佳方法是什么 如何使用 lat 和 lng 获取当前位置和目的地位置的距离 LocationManager locationM
  • cmd 上的 Matlab (winxp)

    我刚刚开始用 Matlab 进行一些实验 由于我已经习惯了 Vim 的界面 所以我尝试尽可能远离 Matlab 的编辑器 令我困扰的是 每次我启动 m 文件时 它都会弹出该界面 有没有办法从 cmd 行启动 test m 并让它在 cmd
  • 当键盘出现时,如何阻止 tableView 滚动? [复制]

    这个问题在这里已经有答案了 我有一个 UITableViewController 每个单元格都包含一个 UITextView 位于每个单元格顶部的单元格 当然 当与文本框的交互开始时 键盘将会出现 同时整个表格也会随着键盘的出现而向上滚动
  • 这个结构怎么会有sizeof == 0呢?

    有一个旧帖子要求构建一个sizeof会回来0 有一些来自高声誉用户的高分答案说 按照标准 没有类型或变量的大小不能为 0 我 100 同意这一点 然而有这个新答案 https stackoverflow com a 47352302 280
  • 使用 Linkedin API v2 获取帖子分析

    最近 我正在开发 Linkedin API v2 但遇到了一些问题 获取某公司的帖子 获取特定帖子的分析 我能够通过使用获取公司统计数据https api linkedin com v2 organizationPageStatistics
  • 使用 GPS android 获取邮政编码 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个应用程序 我需要使用
  • 如何配置 Visual Studio 2017 以在 ASP.Net MVC https 站点中公开非加密端口

    我正在尝试使用 Visual Studio 2017 在我的 locahost 开发计算机 上测试来自 Stripe com 的 webhook 我的网站使用 https 为了测试 webhooks 您需要一个 url 因此在我的本地计算机
  • 检索项目的父级时出错:找不到与给定名称“android:TextAppearance.Material.Widget.Button.Borderless.Colored”匹配的资源

    当我在 android studio 中开始新项目时 我收到了这些错误 错误 1 检索项目的父级时出错 找不到与给定名称 android TextAppearance Material Widget Button Borderless Co
  • Rails:部分中的远程形式:工作一次,而不是两次

    最近几天我遇到了一个问题 我想使用远程表单更新对象 当我第一次提交表单时 我基本上可以更新我的对象 但第二次就不起作用了 所以 我有一个部分的远程表单 查看 missions table form haml erb tr class gt
  • 删除一个cookie

    当我想删除 Cookie 时 我会尝试 unset COOKIE hello 我在 Firefox 的 cookie 浏览器中看到 cookie 仍然存在 我怎样才能真正删除cookie 你可以试试这个 if isset COOKIE re
  • 如何禁用 Rails 4 缓存的日志记录

    如何在 rails 4 1 中禁用缓存日志记录 具体来说 我试图摆脱像这样的片段缓存日志条目 Write fragment views 0 3ms Read fragment views 0 3ms 这个怎么样 config initial
  • 如何在 python 中打印日期之前的 30 天,在 Tkinter 中也是如此

    我正在使用 Tkinter 构建新冠旅行史调查问卷 前端有选择特定日期的选项 D Day Cronoa 已确认 一旦诺曼底登陆日被确认 该程序应该提供用于输入旅行历史数据的字段 我在 Python 中使用 tkcalendar 模块 问题
  • 声明性管道中的文件参数

    我正在开发声明式管道 并希望使用文件参数来读取其内容 但它没有按预期工作 parameters file fileLocation list txt description contains list of projects to be b
  • 在 scala 中使用 FoldRight 进行 FoldLeft

    在经历的同时Scala 中的函数式编程 http www manning com bjarnason 我遇到了这个问题 你能用foldRight 来右转foldLeft 吗 另一种方式怎么样 大约 在作者提供的解决方案中 他们提供了如下实现