假设我们有这样一个函数:
foo (x, _, y) = (x, y)
它的作用是,它需要一个3元组并返回一对由原始元组的第一个和第三个元素组成。
现在假设我们要将这个函数传递给由一些重量级对象组成的3元组。是否会复制这两个对象以创建新元组,或者元组的内部表示是否仅包含对象的引用?
我认为,由于Haskell中的数据是不可变的,因此不需要额外的复制,但我只是想确定。
如果这种行为是实现定义的,我想知道在这种情况下不同的实现是做什么的。
答案 0 :(得分:11)
它将被引用 - 或者甚至不是,但只是一个thunk。 Haskell的懒惰评估意味着它基本上只是从表达式中删除_,如果你需要它的值,它将被扩展。它与fst和snd等基本功能没有什么不同。
答案 1 :(得分:4)
x
和y
是指向值的指针(或者,如果尚未评估值,则指向thunks)。只复制指针,值不复制。基本上它是实现定义的,但是这是所有实现的方式,因为这样你可以实现lazy evaluation,其中值最多只评估一次。