【问题标题】:Constructing a tuple (or list) from already-existing objects - what is the cost?从已经存在的对象构造一个元组(或列表)——成本是多少?
【发布时间】:2011-07-11 20:09:42
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • foo (Just x', _, Just y') = (Just x', Just y')这可能会重新构造两个'Just',但不会复制x' & y';和foo (x@(Just x'), _, y@(Just y')) = (x, y) 可能更有效。 :)

标签: haskell tuples


【解决方案1】:

这将是引用 - 甚至不是引用,而只是一个 thunk。 Haskell 的惰性求值意味着它基本上只是从表达式中删除 _,如果您需要它的值,它将被扩展。它与 fst 和 snd 等基本函数没有什么不同。

【讨论】:

  • 唯一要重写的对象是元组构造函数。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多