Haskell 声明中的感叹号是什么意思?

2023-11-29

当我尝试使用真实的项目来驱动 Haskell 时,我遇到了以下定义。我不明白每个参数前面的感叹号是什么意思,我的书上似乎没有提到它。

data MidiMessage = MidiMessage !Int !MidiMessage

这是一个严格的声明。基本上,这意味着在创建数据结构值时必须将其评估为所谓的“弱头范式”。让我们看一个例子,以便我们了解这意味着什么:

data Foo = Foo Int Int !Int !(Maybe Int)

f = Foo (2+2) (3+3) (4+4) (Just (5+5))

功能f上面的计算时,将返回一个“thunk”:即执行以计算出其值的代码。那时,Foo 甚至还不存在,只有代码。

但在某些时候,有人可能会尝试查看它的内部,可能是通过模式匹配:

case f of
     Foo 0 _ _ _ -> "first arg is zero"
     _           -> "first arge is something else"

这将执行足够的代码来完成其需要的操作,仅此而已。因此它将创建一个带有四个参数的 Foo (因为如果它不存在,你就无法查看它的内部)。首先,由于我们正在测试它,因此我们需要一路评估4,我们意识到它不匹配。

第二个不需要评估,因为我们没有测试它。因此,而不是6存储在该内存位置中,我们将只存储代码以供以后可能的评估,(3+3)。只有当有人看它时,它才会变成6。

然而,第三个参数有一个!在它前面,所以被严格评估:(4+4)被执行,并且8存储在该内存位置。

第四个参数也经过严格评估。但这是有点棘手的地方:我们没有完全评估,而只是针对较弱的正常头部形状。这意味着我们要弄清楚它是否Nothing or Just一些东西,并将其存储起来,但我们不再继续。这意味着我们不存储Just 10但实际上Just (5+5),让里面的 thunk 未被评估。知道这一点很重要,尽管我认为这一点的所有含义都超出了这个问题的范围。

如果启用了,您可以以相同的方式注释函数参数BangPatterns语言扩展:

f x !y = x*y

f (1+1) (2+2)将返回 thunk(1+1)*4.

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

Haskell 声明中的感叹号是什么意思? 的相关文章

随机推荐

  • 使用列名称取消透视

    我有一张桌子StudentMarks有柱子Name Maths Science English 数据就像 Name Maths Science English Tilak 90 40 60 Raj 30 20 10 我想将其安排如下 Nam
  • 如何使用node.js查看phantomjs子进程的标准输出?

    在下面的node js代码中 我通常必须等待phantomjs子进程终止才能获取标准输出 我想知道 phantomjs 子进程运行时是否有任何方法可以查看标准输出 var path require path var childProcess
  • Android Logcat 中的 GC_FOR_MALLOC、GC_EXPLICIT 和其他 GC_* 是什么意思?

    如果您查看 Android 日志 您可能会看到很多这样的内容 它们是什么意思 了解这些可以帮助我们更好地分配内存 Example 28470 dalvikvm D GC FOR MALLOC freed 665 objects 239992
  • 对于小于 100 的数字,大于返回错误值

    这是我的第一个 JavaScript 项目 所以我确信这段代码并不漂亮 可以用更好的方式编写 但除此之外 我遇到了一个我不明白的问题 我确信这只是我自己造成的一个错误 但我就是找不到它 gt 大于 运算符对超过 100 的数字工作正常 但在
  • ReportLabs Django 集成

    我正在跟进这个链接将 ReportLabs 集成到 Django 中 我做的一切都是正确的 但我收到一条错误消息 Exception Type RenderPMError Exception Value Can t setFont Time
  • 使用 Vaadin 8.0.7 将列添加到网格

    当我单击按钮 backBtn 时 我想将列添加到网格中 然后我从文本字段 filterText 获取值 这将是新列的名称 谁能帮我 该代码来自教程 但我需要在此处添加新功能 谢谢 您可以在附件中找到我的代码 网格位于 MyUI 类中 这是客
  • 在 BigQuery 上重新创建 GA 渠道

    我正在尝试使用 BigQuery 重新创建 GA 漏斗 Google360 上的自定义报告 GA 上的漏斗使用每个页面上发生的事件的唯一计数 我在网上发现这个查询大部分有效 SELECT COUNT s0 firstHit AS Landi
  • 如何翻译应用程序模板[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想在我的应用程序中使用多种语言 为此我遵循了此操作doc 在 locale 文件夹中创
  • 如何在Android上提供像按钮一样的imageview点击效果?

    我的 Android 应用程序中有 imageview 我将其用作带有给定 onClick 事件的按钮 但正如您可能猜到的那样 单击时它不会为 imageview 提供可点击的效果 我怎样才能做到这一点 您可以使用如下所示的方法对单个图像执
  • Solr 配置,加密数据配置文件

    如何在这里加密数据配置部分
  • HTML 电子邮件设计有哪些指南? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 您可以为电子邮件中的丰富 HTML 格式提供哪些指导方针 同时在许多客户端和基于 Web 的电子邮件界面中保持良好的视觉稳定性 Stack Overflow 上一个问题的不相关答
  • 如何将日期时间/时间戳从一个时区转换为另一个时区?

    具体来说 给定我的服务器的时区 系统时间角度 和时区输入 我如何计算系统时间 就好像它处于新时区一样 无论夏令时等 import datetime current time datetime datetime now system time
  • 将 UISearchBar 作为子视图添加到 tableView 标头中

    我正在尝试添加自定义标头UITableView 有一些按钮和一个UISearchBar 问题是 当我尝试使用 searchBar 时 我收到一条消息 setting the first responder view of the table
  • python 3.5更新sqlite3版本

    我已经在 Windows 机器上安装了 python 3 5 3 我通过命令 sqlite3 sqlite version 检查 SQLite 版本 它是版本3 8 11 我的问题是如何将 SQLite 版本更新到 3 26 我不确定是否有
  • 向所有请求添加Where条件EF6

    我的大部分实体 并非全部 有两个属性称为CompanyId and Deleted 如何为所有选择请求自动插入这两个属性 而不是在整个应用程序中的每个查询上手动设置 Example db MyEntity Where me gt me Id
  • Codeigniter/PHP:将数据库查询格式化为数组

    this gt db gt select id user id gt from be users gt where id user id data user individual this gt db gt get 如果这是我的数据库查询
  • REGEXP 与 PDO Mysql

    我正在尝试在 PDO Mysql 中使用 REGEX 但出现问题 function artist list artist global DBH STH DBH gt prepare SELECT songs image artist alb
  • java、反射、内部类、

    您好 我想使用反射获取内部类的对象 但我在其中遇到了一些错误 代码是 package reflaction public class MyReflection public static void main String args thro
  • 遍历 jquery 中的嵌套表单元素

    很抱歉 如果这已经发布了 我一直在寻找无济于事 我只是想知道如何在 jquery 中循环嵌套表单 元素 元素不仅是像输入标签这样的严格表单元素 而且还有其他 html 元素 目前我有这段代码可以做到这一点 arguments i formi
  • Haskell 声明中的感叹号是什么意思?

    当我尝试使用真实的项目来驱动 Haskell 时 我遇到了以下定义 我不明白每个参数前面的感叹号是什么意思 我的书上似乎没有提到它 data MidiMessage MidiMessage Int MidiMessage 这是一个严格的声明