gpt4 book ai didi

haskell - seq 一到达构造函数就停止

转载 作者:行者123 更新时间:2023-12-02 06:51:55 27 4
gpt4 key购买 nike

RWH解释说 seq 一到达构造函数就停止。

case1 = 1:repeat undefined `seq` "OK"
case2 = (undefined,undefined) `seq` "OK"

我们有

1:repeat undefined = (:) 1 (repeat undefined)
(undefined,undefined) = (,) undefined undefined

我理解了为什么 case1 函数返回“OK”。但是为什么 case2 函数也返回“OK”呢?我认为 case2 将返回“Preluded.undefined”,因为在第一种情况下 1 被评估,所以我认为 undefined 也应该在第二种情况下评估。

最佳答案

RWH 说,

Consider the value (1+2):(3+4):[]. If we apply seq to this, it will evaluate the (1+2) thunk.

这是不正确的,正如 Phil Thomas 在在线版本中的评论所指出的:

In ghci, if you enter the following:

let x = (1+2):(3+4):[]
seq x True
:print x

You will see:

x = [(_t1::Integer),(_t2::Integer)]

The (1+2) has not been evaluated. The cons is an infix operator that appears to come after the (1+2), but it really is the first thing encountered by the seq.

我们可以认为 seq 被定义为:

⊥ `seq` b = ⊥
a `seq` b = b

为了确定一个值是否为底部,必须仅对其最外层 构造函数进行评估。 1 : repeat undefined 的最外层构造函数不是1,而是(:)。例如,您可以将 1 : [] 可视化为:

 (:)
/ \
1 []

此表示中最外层的构造函数是最顶层构造函数。

这意味着 1 : repeat undefined 将被评估为 _ : _,而不是 1 : _(其中 _ 表示未计算的 thunk)。

类似地,(undefined, undefined) 的最外层构造函数是(,),它将被计算为(_, _) ,而不是 (undefined, _)undefined

关于haskell - seq 一到达构造函数就停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536705/

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