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

大卫

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

data MidiMessage = MidiMessage !Int !MidiMessage
cjs

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

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还是Just某种东西,并将其存储起来,但是我们走得更远了。这意味着我们Just 10实际上不是存储而是Just (5+5)保留其中的杂物未被评估。要知道这一点很重要,尽管我认为这的所有含义都超出了此问题的范围。

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

f x !y = x*y

f (1+1) (2+2)会归还笨拙的(1+1)*4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

linux中感叹号是什么意思?

特质实施中的感叹号是什么意思?

udev规则中的感叹号是什么意思?

diff输出中的感叹号是什么意思?

以下bash命令中的!#(感叹号哈希),!$:r:r(感叹号美元冒号r),!#:t(感叹号冒号冒号t)是什么意思?

在Swift语言中,感叹号是什么意思?

SASS导入后的感叹号是什么意思?

这里的感叹号是什么意思

Windows 8.1 Mail App中的感叹号是什么意思?

JavaScript中变量后的感叹号是什么意思?

Eclipse中的红色感叹号图标是什么意思?

在C#8.0中调用方法之前,感叹号是什么意思?

Android Studio:设备下拉列表中的红色感叹号是什么意思?

布局文件中的红色感叹号是什么意思?

“ git show-branch”中的感叹号是什么意思?

!(感叹号)在javascript中之前和之后是什么意思?

Jupyter笔记本中的感叹号和问号是什么意思?

Eclipse中的红色感叹号图标是什么意思?(图标在右侧,而不是左侧)

实习生定义中的感叹号是什么意思?

Haskell数据声明中的感叹号

在班级名称前面的播放测试图标附近,感叹号是什么意思。浓咖啡。测试中

在函数调用之前,感叹号是什么意思?

单元格引用之前的感叹号是什么意思?

ES6进口-感叹号是什么意思?

函数名称后的感叹号是什么意思?

linux命令中方括号后跟感叹号是什么意思?

Fsharp / FAKE中的双感叹号(!!)是什么?

感叹号在对象表示中的含义是什么

什么是 !!(双感叹号)在 YAML 中?