gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:41:49 27 4
gpt4 key购买 nike

当我尝试使用真实项目来驱动它来学习 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 还是 Just something,然后存储它,但我们不再继续。这意味着我们存储的不是 Just 10,而是实际上 Just (5+5),让 thunk 不被评估。知道这一点很重要,尽管我认为它的所有含义都超出了这个问题的范围。

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

f x !y = x*y

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

关于haskell - Haskell 声明中的感叹号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com