gpt4 book ai didi

haskell - “Strictness” 方括号

转载 作者:行者123 更新时间:2023-12-03 15:30:07 28 4
gpt4 key购买 nike

我将这些定义放在一个文件中:

x = 'a' : 'b' : 'c' : []
y = ['a', 'b', 'c']

(重要的是在文件中定义它们,而不是在 GHCi 中,因为在后一种情况下,事情变得更加奇怪,但这是另一个问题。)

现在,我在 GHCi 中加载这个文件,然后:
λ> :sprint x
x = _
λ> :sprint y
y = _
λ> seq x ()
()
λ> seq y ()
()
λ> :sprint x
x = 'a' : _
λ> :sprint y
y = "abc"

这里发生了什么?我了解 x 的情况会发生什么,这正是我所期望的。但是 y 呢? ?

我看到的似乎与 section 3.7 相矛盾报告中说:

Translation: The following identity holds:

[e1, …, ek] = e1 : (e2 : ( … (ek : [])))


此外:
y = [toUpper 'a', 'b', undefined]
λ> seq y ()
()
λ> :sprint y
y = "Ab*** Exception: Prelude.undefined
λ> :sprint y
*** Exception: Prelude.undefined

带有 Char 的列表s 甚至实际评估是强制的,但是对于其他类型的事情仍然很奇怪:
x = True : False : id False : []
y = [True, False, id False]
λ> seq x ()
()
λ> seq y ()
()
λ> :sprint x
x = True : _
λ> :sprint y
y = [True,False,_]

最佳答案

这似乎仅限于 sprint .如果您编写一个简单的程序,例如

import Control.Exception

x, y :: String
x = 'a' : 'b' : undefined : []
y = ['a', 'b', undefined]

main :: IO ()
main = do
evaluate x
evaluate y
putStrLn "Done"

然后 evaluating两个到 WHNF不碰 undefined .

我的猜测是,出于某种奇怪的原因,GHCi 决定打印 x作为列表,但 y作为一个字符串,这是强制评估整个 y 的东西,而不是 seq/ evaluate来电。

关于haskell - “Strictness” 方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177681/

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