【发布时间】:2014-02-12 16:55:22
【问题描述】:
在 GHCi 中:(> 表示输出)
data Unit = Unit
let x = Unit
let y = ()
:p x
> x = (_t1::Unit)
:p y
> y = ()
:i ()
> data () = () -- Defined in `GHC.Tuple'
为什么Unit 和() 的行为不同?还有其他类型的行为类似于(),例如Int 和Char。还有其他这种类型吗?
令人惊讶的是,当我将 () 替换为 undefined 时,它的行为再次符合我的预期:
let y = undefined :: ()
:p y
y = (_t2::())
【问题讨论】:
-
我也不完全理解这个区别,但它似乎与正在编译的代码有关。例如
let x = True和:p x也显示x = True。并且使用Unit定义编译模块使其与()的行为相匹配。 -
我有个主意。
Unit构造函数就像一个顶级常量。如果它被评估一次,它将在程序的整个运行时间内保持评估。我猜有些值默认是evaluated(因为几乎每个程序都需要它们)。您可以在尝试let x = Unit; y = Unit时对此进行测试。即使你只评估y,之后也会评估x。 -
@bennofs 如果您将类型设为
newtype Unit = Unit ()或data Unit = Unit (),您也会得到不同的行为,它们的行为更像()。
标签: haskell lazy-evaluation evaluation