在 Haskell 中,性能和绑定

2024-01-13

我刚刚学习 Haskell,并从教程网站编写了两个程序,这样

maximumnowhere :: (Ord a) => [a] -> a
maximumnowhere [] = error "empty"
maximumnowhere [x] = x
maximumnowhere (x:xs) = if x > maximumnowhere xs then x else maximumnowhere xs

and

maximumwhere :: (Ord a) => [a] -> a
maximumwhere [] = error "empty"
maximumwhere [x] = x
maximumwhere (x:xs) = if x > maximum' then x else maximum' where maximum' = maximumwhere xs

我认为这两个程序相当等效,因为我认为 where 绑定仅用变量的内容替换变量。但是当我在 ghci 中运行它时,第一个比后者慢得多,特别是对于长度超过 25 的数组。可能是 where 绑定造成了巨大的性能差异,但我不知道为什么。谁能为我解释一下吗?


不,它们并不等同。let and where介绍sharing http://www.haskell.org/haskellwiki/Sharing,这意味着该值仅被评估一次。编译器通常不会共享两个相同表达式的结果,除非您告诉它,因为它通常无法自行判断这样做的时空权衡是否有利。

因此,您的第一个程序将在每次迭代中执行两次递归调用,从而使其O(2^n),而第二个每次迭代只执行一次,即O(n)。这些之间的差异是巨大的。在n = 25,第一个程序导致超过 3300 万次递归调用,而第二个程序仅执行 25 次。

所以这个故事的寓意是,如果你想分享,你需要通过使用来请求let or where.

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

在 Haskell 中,性能和绑定 的相关文章

  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n

随机推荐

  • 如何从c中的sock结构中获取ip地址?

    我正在编写简单的服务器 客户端 并尝试获取客户端 IP 地址并将其保存在服务器端 以决定哪个客户端应该进入关键部分 我用谷歌搜索了好几次 但找不到从袜子结构中获取IP地址的正确方法 我相信这是服务器接受客户端请求后从 sock 结构获取 I
  • Python“除了”失败

    我想知道你是否可以重新引发一个 特定的 捕获的异常 并让它被稍后的 一般的 捕获 除了在同一个 try except 中 例如 我想对特定的 IOError 执行某些操作 但如果它不是预期的 IOError 则应像处理任何其他错误一样处理该
  • Python 中的图像抓取程序未按预期运行

    我的代码只返回一个空字符串 我不知道为什么 import urllib2 def getImage url page urllib2 urlopen url page page read Gives HTML to parse start
  • Z_DATA_ERROR,ERRNO -3,zlib:数据检查不正确,MBA M1

    最近 我在 MacBook Air M1 机器上使用最新的 Node 和 NPM 安装依赖项时遇到了问题 然后我发现M1不支持最新的Node版本 所以我的解决方案是使用 NVM 并将其更改为 Node v14 16 一切都运行良好 但是当我
  • Angular 2:“...”的路由生成器未包含在传递的参数中

    所以我的 AuthenticationService 中有以下代码 检查登录凭据后 用户将被重定向到他们的个人资料 authentication service ts redirectUser username string void Re
  • 适用于 Android 的 Tensorflow 量化图

    我正在尝试将量化图表加载到 Android 应用程序中 我的构建文件包含 deps tensorflow core android tensorflow lib tensorflow contrib quantization cc arra
  • 多个描述元标记有效吗?

    用不同的语言定义多个元描述是否有效 这是有效的吗 有效 是的 搜索引擎正确处理 目前看来并非如此 大多数 SEO 验证者都会抱怨多个描述 即使它们被标记为不同的语言代码 并且如前所述 在某些情况下会被视为垃圾邮件进行处罚 没有理由不让一个页
  • 消费者不使用 Riverpod 重建 UI

    我正在尝试使用 Riverpod 制作简单的 stateNotifier 当我单击按钮时 它将在值之间切换 我检查了该值 按下按钮时它会发生变化 问题是 UI 没有自行重建 我已经检查了文档并且非常确定我做得正确 主屏幕 class Hom
  • 如何在生成下载文件时显示加载动画?

    我有一个 Web 应用程序 用户可以在其中生成 PDF 和 PowerPoint 文件 这些文件可能需要一些时间才能生成 因此我希望能够在生成时显示加载动画 这里的问题是我无法知道下载何时开始 动画永远不会消失 我知道可以 在侧面 生成文件
  • 通过本机 Java API 验证 Windows 用户凭据

    我需要存储 Windows 用户名和凭据 以便稍后运行一些需要这些凭据的进程 当我收集这些作为用户的输入时 我想验证凭据是否正确 Java 中是否有原生 api 可以帮助我验证 Windows 系统凭据 我正在经历LoginContext类
  • 第一个 li 的 JQuery 选择器

    当用户单击第一个 li 又名 任何日期 时 我需要一个 onclick 事件 如何使用 jQuery 选择该元素 ul class ui menu ui widget ui widget content li class ui menu i
  • 为什么 Swift 会隐式解包可选的“nil”?

    self presentTextInputControllerWithSuggestions nil allowedInputMode WKTextInputMode Plain results AnyObject gt Void in r
  • 出生日期限制

    我想将日期选择器对话框限制为至少选择 18 岁 val c Calendar getInstance val year c get Calendar YEAR val month c get Calendar MONTH val day c
  • 如何实现基于行的文件内容的并行处理

    我正在编写一个 POC 来处理一个非常大的文本文件 约 10 亿行以上 并正在为此尝试使用 Go package main import bufio fmt log os time func main start time Now file
  • 相互递归类

    如何在 C 中实现相互递归类 就像是 Recursion h ifndef RECURSION H define RECURSION H class Class1 Class2 Class2 ptr public void Class1 m
  • 访问 TKinter 脚本中的主线程?

    我想明白为什么我收到以下错误TclStackFree incorrect freePtr Call out of sequence 但我不知道如何解决这个问题 我的脚本摘要 My Python TKinter脚本由三个活动线程组成 主线程和
  • 学习 JavaScript 的好资源 [关闭]

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

    我已经成功运行了几个 Python 脚本 并使用 subprocess 模块从基本脚本调用它们 subprocess popen sys executable script py shell True 但是 每个脚本都会执行一些模拟 来自
  • 当检索方法无法产生返回值时,它应该返回“null”还是抛出异常? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我使用java语言 我有一个方法 如果找到一个对象 它应该返回一个对象 如果没有找到 我应该 返回空值 抛出异常 other 哪个是最佳实践或习
  • 在 Haskell 中,性能和绑定

    我刚刚学习 Haskell 并从教程网站编写了两个程序 这样 maximumnowhere Ord a gt a gt a maximumnowhere error empty maximumnowhere x x maximumnowhe