ben*_*ofs 9 evaluation haskell lazy-evaluation
在GHCi中:(>表示输出)
data Unit = Unit
let x = Unit
let y = ()
:p x
> x = (_t1::Unit)
:p y
> y = ()
:i ()
> data () = () -- Defined in `GHC.Tuple'
Run Code Online (Sandbox Code Playgroud)
为什么Unit和()表现不一样?还有其他类型的行为(),例如Int和Char.还有其他类型的吗?
出人意料的是,当我更换()的undefined,它的行为,我再次希望:
let y = undefined :: ()
:p y
y = (_t2::())
Run Code Online (Sandbox Code Playgroud)
您可能想看看这个GHCi会话:
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>
Run Code Online (Sandbox Code Playgroud)
基本上,后x和x2被定义,x是一个未计算的形实转换.在我强制进行评估之后x2,我们发现它x也被评估了.x3尽管后来被定义,变量永远不会处于未评估的状态.
我相信GHCi正在这里进行一些优化,只创造一个thunk Unit.每次使用值构造函数时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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |