从已存在的对象构造元组(或列表) - 成本是多少?

时间:2011-07-11 20:09:43

标签: haskell tuples

假设我们有这样一个函数:

foo (x, _, y) = (x, y)

它的作用是,它需要一个3元组并返回一对由原始元组的第一个和第三个元素组成。

现在假设我们要将这个函数传递给由一些重量级对象组成的3元组。是否会复制这两个对象以创建新元组,或者元组的内部表示是否仅包含对象的引用?

我认为,由于Haskell中的数据是不可变的,因此不需要额外的复制,但我只是想确定。

如果这种行为是实现定义的,我想知道在这种情况下不同的实现是做什么的。

2 个答案:

答案 0 :(得分:11)

它将被引用 - 或者甚至不是,但只是一个thunk。 Haskell的懒惰评估意味着它基本上只是从表达式中删除_,如果你需要它的值,它将被扩展。它与fst和snd等基本功能没有什么不同。

答案 1 :(得分:4)

xy是指向值的指针(或者,如果尚未评估值,则指向thunks)。只复制指针,值不复制。基本上它是实现定义的,但是这是所有实现的方式,因为这样你可以实现lazy evaluation,其中值最多只评估一次。