表示输出) data Unit = Unit let x = Unit let y = () :p x > x = (_t1::Unit) :p y > y = () :i (-6ren">
gpt4 book ai didi

haskell - 为什么 "data Unit = Unit"和 "()"在 GHCi 中的行为不同?

转载 作者:行者123 更新时间:2023-12-04 04:05:28 25 4
gpt4 key购买 nike

在 GHCi 中:(> 表示输出)

data Unit = Unit
let x = Unit
let y = ()
:p x
> x = (_t1::Unit)
:p y
> y = ()
:i ()
> data () = () -- Defined in `GHC.Tuple'

为什么要 Unit()表现不同?还有其他类型的行为类似于 () ,例如 IntChar .还有其他这样的类型吗?

令人惊讶的是,当我替换 ()通过 undefined ,它的行为再次符合我的预期:

let y = undefined :: ()
:p y
y = (_t2::())

最佳答案

您可能想查看此 GHCi session :

Prelude> data Unit = Unit deriving Show
Prelude> let x = Unit
Prelude> let x2 = Unit
Prelude> :p x
x = (_t1::Unit)
Prelude> x2
Unit
Prelude> :p x
x = <.:Interactive.Unit>
Prelude> let x3 = Unit
Prelude> :p x3
x3 = <.:Interactive.Unit>

基本上,在 x 之后和 x2已定义, x是一个未评估的重击。在我强制评估 x2 之后,我们发现 x也被评价了。变量 x3 ,尽管稍后定义,但永远不会处于未评估状态。

我相信 GHCi 在这里进行了一些优化,只为 Unit 创建了一个 thunk .每次使用值构造函数 Unit , GHCi 重用那个 thunk。因此,第一次强制执行单个 thunk 时,通过构造函数定义的每个变量都出现在评估状态。

IIRC,小 Integer文字也使用共享的预评估 thunk:
Prelude> let y3 = 3 :: Integer
Prelude> :p y3
y3 = 3
Prelude> let y4 = 344444444444444 :: Integer
Prelude> :p y4
y4 = (_t3::Integer)

关于haskell - 为什么 "data Unit = Unit"和 "()"在 GHCi 中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734393/

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