2012年11月15日星期四

The Haskell Heap

这是对Edward Z. YangHaskell Heap系列的翻译。
感谢Edward的无私奉献,允许我对这些文章进行翻译。
Edward以Creative Commons Attribution-ShareAlike 3.0 Unported License对文章进行了授权,所以译文也以此License发布。 

--------------------------------------------------------------------------------

                  The Haskell Heap

原文地址为:http://blog.ezyang.com/2011/04/the-haskell-heap/

Haskell heap是一个相当古怪的地方。它和传统的、严格求值的语言的heap可不一样...
...传统的heap就是一个杂货堆(原始的旧数据)!

在Haskell heap中,每个项都被漂亮地包装在盒子中:Haskell heap是礼物堆(thunks)。
如果你确实想知道礼物里面是什么,你得打开它(对它求值)。
礼物往往有名字,有时当你打开礼物时,你会得到一张礼物卡(data constructor)。这些礼物卡有两个特征:它们有名字(比如Just礼物卡,或者Right礼物卡);它们可以告诉你你剩下的礼物在哪里。可能不止一个礼物哦(比如tuple礼物卡),如果你是个幸运的家伙!
但是就像买了礼物卡放在那里不用一样(礼物卡公司就是这么赚钱的!),你也不是必须要拿回那些礼物。

Haskell heap上的礼物可是相当淘气的。一些礼物当你打开时会爆炸;而另一些礼物闹鬼哦,这些鬼魂被打扰时会偷偷打开别的礼物的。




理解你打开礼物时会发生什么 是理解Haskell程序时间和空间行为的关键。


在这个系列中,Edward将进军网络漫画,以此来展示惰性求值语言中关于“求值”的一些关键的操作上的概念。希望你喜欢!

下一篇是:Haskell Heap上的求值

技术注解
从技术上来讲,这个系列应该叫“The GHC Heap”。但是,我将尽力最大程度地避免GHC主义,简单地为在操作上探究任一种惰性语言提供一种隐喻。一开始,这个系列叫做“Bomberman Teaches Lazy Evaluation”,但是当我尝试以炸弹作为隐喻,来类比错误的或者无法终止的thunks时,我发现自己想要个更好的隐喻——它要特别能体现惰性求值的一些关键点:它要能体现已求值和未求值的区别,以及礼物一旦打开,就向所有人开放这个事实。使用术语“boxed”带有一些暗示性:实际上,boxed或者lifted values在GHC中恰好是那些可以无穷的值,而unboxed values和那些你在C heap中看到的更类似一些。然而,像Java这样的语言也使用术语“boxed”用来表示看起来像objects的primitive values。为了不至于混淆,从现在起我们将不再使用术语“boxed”(实际上,我们也不会讨论unboxed types)。



没有评论:

发表评论