首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个Haskell语句不能懒惰地评估?

Haskell语言是一种纯函数式编程语言,它的特点之一就是采用了惰性(lazy)求值策略。惰性求值意味着表达式只在需要的时候才会被求值,这样可以避免不必要的计算,提高程序的效率。

然而,并非所有的Haskell语句都可以被懒惰地评估。有以下几种情况下,Haskell语句不能懒惰地评估:

  1. 使用了严格模式(Strict Mode):在某些情况下,我们可能需要强制求值,而不是依赖惰性求值。通过使用严格模式,我们可以指定某个表达式必须在定义时立即求值,而不是等到需要时再求值。
  2. 使用了副作用(Side Effects):Haskell语言鼓励纯函数式编程,即函数的输出只依赖于输入,没有任何副作用。但是,如果一个Haskell语句包含了副作用,比如修改了全局变量或者进行了IO操作,那么它就不能被懒惰地评估,因为副作用需要立即执行。
  3. 使用了严格数据类型(Strict Data Types):Haskell语言中的数据类型默认是惰性求值的,但是我们也可以使用严格数据类型来指定某个数据类型必须在定义时立即求值。如果一个Haskell语句使用了严格数据类型,那么它就不能被懒惰地评估。

总结起来,Haskell语句不能懒惰地评估的情况包括使用了严格模式、包含副作用以及使用了严格数据类型。在这些情况下,我们需要明确指定求值的时机,而不能依赖惰性求值的特性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

听君一席话,如听一席话,解释解释“惰性求值”~

不用每次都全部执行,只有在进入确定的条件,需要对值进行返回的时候,才需要计算; 这,就,是, —— 惰性求值的思想体现(不需要立即返回的值,就先别计算;) 庐山面目 来看下 wiki 释义: 惰性求值又叫惰性计算、懒惰求值...有点像 Promise 的意思,你不告诉我 resolve/reject,我就 pending;Haskell 中,你不告诉我什么时候调用这个值,我就维持 thunk 的状态; 无限列表 在 Haskell...不断递增的数组; 为什么Haskell 中行,在 JavaScript 中不行?...因为它是懒惰的,你定义归你定义,反正定义的时候,我又不用分配无穷大的内存,等你开始调用的时候,我再开始计算分配吧! 延迟计算很棒,不过事物都有两面性,这样做坏处是什么?...(思路:强制求值第一个参数,返回第二个参数;) 函数式语言和命令式语言的内存模型; 懒惰奥义 听君一席话,如听一席话,希望看完本篇后,有人再问你“什么是惰性求值”,能心里有个基本的谱~~ 人天性爱偷懒

62820

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)

当我们面对各种各样的特定需求的时候,一个通用的语言往往不能高效提供解决问题的路径,相应的 DSL 并不是并非要解决所有的问题,但是它只关注于某一个小领域,以便解决那一个小领域的问题就好了。...比如 HTML,只用于网页渲染,出了这个圈子它什么都不做,但是用来表达网页的内容却很擅长,有很多内置的标签来表达有预定义含义的内容;再比如 SQL,只能写数据库相关的操作语句,但是很适合用来描述要查询什么样的一个数据集合...但是,直到 014 年 4 月 JSR-335 才正式 final release,不能不说这个来得有点晚。...比如 Categories,这个,我在前面一篇 《元编程》中已经介绍过了。 最后来说 Haskell。...因为对于常规语言,如果面临递归工作栈过深的问题,可以优化为循环解决问题;但是在 Haskell 中,是没有循环语法的,这就意味着必须用尾递归来解决这个本来得用循环才能解决的问题。

47410
  • 5 种可能在 10 年后消失的编程语言

    如果一门语言不能随着时间的推移而保持其价值,它要么逐渐变得默默无闻,要么成为更新、更好的语言。 ? 最近,我们从COBOL语言的发展中,重新了解了这个过程的详情。...那为什么我认为Ruby可能会消失呢?导致其衰退的一个因素是速度。它的应用程序往往比许多其他流行语言开发的执行效率更差,例如:Javascript、Go,甚至Python(在某些框架下)。...Haskell ? Haskell 是另一个古老的语言,它是于几十年前所发布的语言。对Haskell来说,它的时代可能很快就要结束了。...Swift已经成功实现了较高的稳定性和用户采用率,而苹果公司仍在重写Obj-C库,以使旧语言的支持者更容易过渡。...但如果你正在从事开发的工作或计划通过某一种语言进入软件开发行业,你不应该只选择最时髦的选择,或者被炒作出的开发语言,你要综合通过功能、市场需求和可见的未来发展潜力几个角度去评估,这样会更好。

    57730

    Web 开发选 MVC 还是 DDD?

    这就是惯性的力量,无论是勤劳还是懒惰,都会产生惯性,于是勤劳者越来越勤劳,懒惰者越来越懒惰,学霸越来越霸,学渣越来越渣。时间一长,就会觉得自己根本无法改变自己,总会回到我们习以为常的状态。...下班后就那么点时间,用于这个不能用于那个,而我又是一个喜欢写代码的人,一旦开始写代码,时间就飞快的流失,从晚上 8 点写到晚上 12 点,也是一眨眼的功夫,明天还要上班,我不可能再熬夜。...MVC 适合简单的业务,DDD 适合复杂的业务,为什么这么说呢?...你可能会问,DDD 不就是把部分数据的操作放在了模型里面吗,为什么就适合复杂的业务呢? 不夸张讲,MVC 模式的开发,大部分都是 SQL 驱动(SQL-Driven)的开发模式。...而 SQL 语句不能复用的,新接口开发即使有部分相同的逻辑,也只能重新编写视图函数。 而 DDD 开发模式下,我们需要事先理清楚所有的业务,定义领域模型所包含的属性和方法。

    2K10

    为什么 Haskell 是我们构建生产软件系统的首选

    这个运算符会隐式这个整数转换为字符串吗? 这两个值可比吗? 这并不是说上面这些都是在 Haskell 中永远不需要回答的问题;这里说的是当你需要解决其中一个问题时,编译器会抛出一个错误。...通过一个示例可以很好说明 ADT 的能力。假设我们正在创建一个必须跟踪客户发票的发票系统。每张发票必须包含这个发票所针对的行项目的一个列表,并具有一个表明订单已付款还是已取消的发票状态。...好像我们忘记更新 createCustomerNotification 函数来处理这个新状态值。编译器抛出一个错误,并告诉我们 case 语句在其模式匹配中不处理 Refunded 值。...在这种情况下,自动化测试不能代替类型,因为引入新的可能值通常需要更新测试以断言是否可以处理新值,这并不能帮助我们避免问题——我们很容易忘记更新业务逻辑是,所以也很容易忘记更新业务逻辑的测试。...但是,当有人在寻求帮助或想要大致了解这个语言时,随便选择哪个社区都是不错的主意。 10结论 为什么 Haskell 是我们构建生产软件系统的首选编程语言呢?原因有很多。

    1.4K10

    ECMA-262-3深入解析第八章:评估策略

    渴望(eager)与懒惰(lazy)评估 从初步评估的角度,这里有两个重要的策略:严格(strict)(有时候被叫做渴望),意味着参数是在他们使用前评估,另一个是不严格(no-strict),表示评估是在实际使用参数时按需进行的...(又叫做懒惰评估)。...在这个例子中,错误可能抛出,也可能不,这取决于我们是否真的需要这个参数,以及这个变量是否在将来存在。 参数评估顺序 此外,参数评估与传递的顺下也是被标准了:从左往右。...ECMAScirpt实现 所以现在更清晰了,ECMAScript中使用的是哪一个评估策略 — 共享策略。即,我们可以修改对象的属性,但是不能完全重新分配它。...语句“对象按引用传递”在形式上与ECMAScript不相关,并且是错误的。

    94710

    什么是好的编程语言?

    许多 C++程序员在使用 Java 时编写了功能完备且合理的面向对象代码,但是 C++的臃肿却不能很好满足 Java 中的优雅(即使 C++程序员可能认为它除了 Java 的「缺陷」之外大多是优雅的)...他本想避免这个,但实施起来太容易了,所以他无法抗拒。他还发明了很多好东西,比如 switch 语句和通信顺序、进程的思想,它们经常出现在 Go 和 Ada 的并发范例中。...由于 Ada 在设计上的一致性,所以即使你不知道构造的具体细节,也可以很好了解代码所做的事情。并且,Ada 有优秀的文档,文档中包含了为什么每个特征会存在。...有趣的是,当 GO 被显式替换为 C++时,结果喜欢 C++的程序员发现,C++ 在复杂程度上很高,这使得他们感觉自己是宇宙的主宰,除了 Haskell 之外,他们永远不会换用任何其他语言。...match 语句简洁指出,每当我们遇到「rule」元素,当它是具有值为「top」属性的「section」元素的子元素时,我们应该从这个模板中得到一个结果。现在,你通常会编写多少代码来确定类似的内容?

    2.6K20

    好的编程语言具备哪些特性?

    许多 C++程序员在使用 Java 时编写了功能完备且合理的面向对象代码,但是 C++的臃肿却不能很好满足 Java 中的优雅(即使 C++程序员可能认为它除了 Java 的「缺陷」之外大多是优雅的)...他本想避免这个,但实施起来太容易了,所以他无法抗拒。他还发明了很多好东西,比如 switch 语句和通信顺序、进程的思想,它们经常出现在 Go 和 Ada 的并发范例中。...由于 Ada 在设计上的一致性,所以即使你不知道构造的具体细节,也可以很好了解代码所做的事情。并且,Ada 有优秀的文档,文档中包含了为什么每个特征会存在。...有趣的是,当 GO 被显式替换为 C++时,结果喜欢 C++的程序员发现,C++ 在复杂程度上很高,这使得他们感觉自己是宇宙的主宰,除了 Haskell 之外,他们永远不会换用任何其他语言。...match 语句简洁指出,每当我们遇到「rule」元素,当它是具有值为「top」属性的「section」元素的子元素时,我们应该从这个模板中得到一个结果。现在,你通常会编写多少代码来确定类似的内容?

    2K10

    为什么大规模 Scrum 框架大都只是跟风,迟早会被放弃?

    到头来总算有人提供了具体的证据,告诉大家为什么这个框架那么受欢迎、广告打得那么好,可就是没啥用。 Jeremiah 的帖子和我对 Spotify 模型的个人体验是一致的。...它们具有破坏性,让人们懒惰成性,使组织走上平庸之路。 于是我提出了以下问题: 为什么大规模框架在实践中往往不能解决它们承诺解决的问题? 好吧,我不相信这个问题有一个单一的、简洁的答案。...我们忽略了一种可能性,那就是这个框架可能并不足以解决我们的问题。 公平地说,许多 Scrum 团队都面临着同样的问题。他们关注的并不是如何才能更好交付价值,而是如何更好执行 Scrum。...你只能不断去尝试各种事物,并评估它们是否真的有效,才能解决这个问题。 问题是大多数大规模框架捆绑了许多不同的实践。这是一锤子买卖。...现在,我并不能说自己已经有了所有大规模框架的实践经验,自然也没法断言所有大规模框架都是懒惰和破坏性的,就像那些流行健康食谱一样。

    36810

    Node起源及名称由来

    为什么是JavaScript Ryan Dahl是一名资深的C/C++程序员,在创造出Node之前,他的主要工作都是围绕高性能Web服务器的。...写作Node的时候,Ryan Dahl曾经评估过C、Lua、Haskell、Ruby等语言作为备选实现,结论是:C的开发成本太高,可以预见不会有太多的开发者能将它用于日常的业务开发,所以舍弃它;又觉得自己还不足够玩转...Haskell,所以舍弃它;Lua自身已经含有很多阻塞I/O库,为其构建非阻塞I/O库也不能改变人们继续使用阻塞I/O库的习惯,所以也舍弃它;而Ruby的虚拟机由于性能不好而落选。...为什么叫Node 起初,Ryan Dahl称他的项目为web.js,就是一个web服务器,但是项目的发展超过他最初单纯开发一个Web服务器的想法,变成了构建一个网络应用的基础框架,这样可以在它的基础上构建出更多的东西出来...每一个Node进程都构成这个网络应用中的节点,这是它名字所含意义的真谛。 本文参考:简书【游泳的石头】https://www.jianshu.com/p/b703b0436357 END

    61130

    Python|Google Python样式指南(2)

    2.11.2 优点 比if语句更短,更方便。 2.11.3缺点 可能比if语句难读。如果表达式很长,则可能很难找到条件。 2.11.4 结论 适用于单行函数....2.12.3缺点 默认参数在模块加载时评估一次。如果参数是可变对象(例如列表或字典),则可能会导致问题。如果函数修改了对象(例如,通过将项目附加到列表),则默认值将被修改。...允许计算是懒惰的。考虑使用Python方式维护类的接口。在性能方面,当直接变量访问是合理的时,允许属性绕过需要琐碎的访问器方法的情况。这也允许将来在不破坏接口的情况下添加访问器方法。...2.16.1 定义 嵌套的Python函数可以引用在封闭函数中定义的变量,但不能分配给它们。变量绑定使用词法作用域来解决,即基于静态程序文本。...特别让经验丰富的Lisp和Scheme(以及Haskell和ML等)的程序员感到欣慰。 2.16.3 缺点 可能导致令人困惑的错误。 2.16.4 结论 可以使用。

    71030

    Python什么时候会被取代?

    因为总是会有人在这之前就遇到了这个问题,并为此撰写了一些有用的资料。...这基本上意味着,为了评估表达式,编译器首先需要搜索当前块,然后依次搜索所有调用函数。 动态作用域的问题在于,每个表达式都需要在所有上下文中进行测试,这很繁琐。...Lambda只能是Python中的表达式,而不能语句。 另一方面,变量声明和语句始终是语句,这意味着它们不能使用Lambda。...Haskell等新兴的编程语言解决了这个问题:它们依赖空白,但同时也为那些希望不用空白的人提供了另一种语法。 移动开发 我们目睹了从台式机向智能手机的转变,很明显,我们需要强大的语言来构建移动软件。...然而,由于移动设备的使用已然超越了桌面设备,因此我们肯定说,学习Python不足以成为经验丰富的全方面开发人员。 运行时错误 Python不需要首先编译,然后再执行。

    59900

    125. 精读《深度学习 - 函数式之美》

    就很好的诠释了这个道理。...所以为什么函数式编程语言可以胜任深度学习的计算要求呢? 深度学习的计算模型本质上是数学模型,而数学模型本质上和函数式编程思路是一致的:数据不可变且函数间可以任意组合。...,按理说每个线程都修改这个引用会导致竞争状态出现,但从结果来看是正常的,说明 Clojure 引擎在执行时会自动解决这个问题。...3 总结 本文介绍了为什么深度学习更适合使用函数式语言,以及介绍了 Clojure 与 Haskell 语言的共性:安全性、高性能,以及各自独有的特性,证明了为何这两种语言更适合用在深度学习中。...函数式应该只有表达式,没有语句,这是因为函数式是为了处理运算而诞生的,因此很适合用在深度学习领域。

    41210

    Heskell与函数式编程

    导语 :这个系列打算分为三部分,由浅入深介绍所谓的函数式编程 1)Haskell入门 2)Monad介绍 3)函数式编程的思想 Haskell简介 Haskell诞生于1990年,是一门纯函数式编程语言...然后看下Haskell这个问题的处理: ?...编写第一个Haskell 编写Haskell之前需要把Haskell Platform下载下来(https://www.haskell.org/platform/),安装后使用ghci就可以进行Haskell...我的电脑是Windows,在Windows下打开cmd,输入ghci,就能进入编程界面,在这个界面能够进行简单的编码,比如下面: ? 这里简单的进行了一次 3+5的求和操作。...这段代码定义了一个函数findMax,输入两个数字x和y,输出x和y的最大值,这里要注意下haskell内if else语句else是不可或缺的,不像JAVA可以只写if不写else。

    82170

    系统Prompt长达1700个token,ChatGPT变「懒」的原因找到了?

    现阶段,ChatGPT 已经成为很多人的得力助手,写文档、编代码、生成图片…… 但看似无所不能的 ChatGPT,也有其懒惰的一面。...还有人表示:「没有证据表明较长的系统 prompt 会影响输出质量,我不知道为什么每个人都认为他们比 OpenAI 更了解自己。」...最后,还有网友继续抱怨「昨天我在编写 Python 代码中遇到了这个问题,它完成了代码的 90%,然后说最后一段逻辑太复杂了,但告诉我如何去做.........之后我开始了一个新的聊天,给了它自己写的 Python 代码,并说这个代码不完整 —— 你可以将它所需的行添加完整吗…… 然后 ChatGPT 就毫无问题添加了代码。...从这可以看出,ChatGPT 绝对是懒惰的。」 看来,ChatGPT 的懒惰问题还需要时间解决。 参考链接: https://news.ycombinator.com/item?

    16010

    观点 | Python 什么时候会被取代?

    因为总是会有人在这之前就遇到了这个问题,并为此撰写了一些有用的资料。...这基本上意味着,为了评估表达式,编译器首先需要搜索当前块,然后依次搜索所有调用函数。 动态作用域的问题在于,每个表达式都需要在所有上下文中进行测试,这很繁琐。...Lambda只能是Python中的表达式,而不能语句。 另一方面,变量声明和语句始终是语句,这意味着它们不能使用Lambda。...Haskell等新兴的编程语言解决了这个问题:它们依赖空白,但同时也为那些希望不用空白的人提供了另一种语法。 移动开发 我们目睹了从台式机向智能手机的转变,很明显,我们需要强大的语言来构建移动软件。...然而,由于移动设备的使用已然超越了桌面设备,因此我们肯定说,学习Python不足以成为经验丰富的全方面开发人员。 运行时错误 Python不需要首先编译,然后再执行。

    91930

    成为函数式编程工程师四年,我为什么说它既“流氓”又“可爱”

    这个 Java 应用中,我发现了大量“防御性复制代码”。在我把许多核心数据结构从可变改为不可变后,轻松删掉了这些复制代码。...在这个 Java 应用程序中,我把很多代码从使用 null 改为使用一个通用的可选数据结构,这样可以更清楚传达值可能不存在的情况。...而且我非常喜欢那些组织得很好的代码,我可以很容易和安全改变它以适应新的需求。 因此,如果软件工程的目标是正常运作的、可理解及可维护的软件,那么顺着这个逻辑提出的问题是:函数式编程能帮助我们实现它吗?...FP 并不能保护我们。我们需要另一种标准来衡量“好代码“,而不是简单认为“函数式“就是好代码。 我认为这个标准与可组合性、可理解性和正确性有很大关系。...我们不能停留在函数式的世界里。我们不能因为自己写出来“纯函数式“的代码就拍拍屁股走人。我们不能忽视“非函数式化“的编程技术,包括逻辑编程和响应式编程等等一大堆范式。

    32820

    Python 未来会被取代吗?

    为什么会被取代? 预测这个时间点到底什么时候到来可能会像科幻小说一样充满各种可能性。本文将阐述 Python 那些受欢迎的优点,以及将来会打败它的弱点。...我将一一介绍最重要的缺陷,并评估这些缺陷是否致命。 速度 Python 很慢。真的,非常非常慢。平均而言,使用 Python 完成一项任务所需的时间,是任何其他编程语言的 2~10 倍。...Lambda 只能是 Python 中的表达式,不能语句。 另一方面,变量声明和语句始终是语句。这意味着 Lambda 并不能用于它们。...其他编程语言,如 C++,则更多依赖花括号和分号。尽管这可能在视觉上不够吸引人,对初学者也不太友好,但是它使代码更易于维护。对于较大的项目,这个方法更有用。...像 Haskell 这样的新语言解决了这个问题:它们依赖于空格,但为那些希望不使用空格的人提供了另一种语法。

    74420

    Haskell 基础

    doubleMe.hs文件,编写如下代码: doubleMe x = x + x 保存,打开ghci,输入 Prelude> :l doubleMe.hs 这样我们就加载了我们的doubleMe函数,然后就可以调用这个函数...Haskell中的if语句与其他语言不同,else是不可以省略的 doubleSmallNum x = if x > 10 then x else x * 2 Haskell 中的 if 语句的另一个特点就是它其实是个表达式...正由于 else 是强制的,if 语句一定会返回某个值,所以说 if 语句也是个表达式。...Tuple List: [(1,2),(3,4),(5,6)] 但是[(1,2),(3,4,5),(5,6)]是会报错的,因为元素类型不一致 两个元素的Tuple可以称为序对(Pair) Tuple不能是单元素的...,因为没有意义 操作函数 fst 返回序对的首项(只能操作序对,不能操作三元组等其他数量的Tuple) snd 返回序对的尾项 Prudule> fst (1,2,[1,2,3]) 1 Prudule>

    6810
    领券