【发布时间】:2014-11-15 20:49:27
【问题描述】:
基本上我很好奇代码是否如下:
let myCollection = Data.SomeCollection.fromList [1, 2, foo]
实际上是在执行它看起来在运行时的样子,并创建一个链表作为创建SomeCollection 的中间步骤——或者如果这只是为了语法方便,编译器会避开编译代码中的列表?
如果这是一个愚蠢的问题,我深表歉意,但自从学习了一些 Haskell 后,我就一直想找出答案。
【问题讨论】:
-
您可能想澄清一下您是否要求
Vector或更一般地要求任何类型。Vector是一种特殊情况,因为它可能具有Vector特定的重写规则来融合中间列表。 -
@GabrielGonzalez 谢谢,我编辑澄清如果对任何带有
fromList的集合进行特殊处理,我很感兴趣,尽管如果只有 some 消除列表(也许Vector例如),这也很高兴知道 -
恐怕你通常不得不假设将有一个实际的列表,除非前面提到的专门的
Vector-optimisations 或类似的启动。 -
一个重要的警告,如果列表恰好是
String,它可能不会通过中间列表,因为这种特殊情况通常是捷径(作为高效OverloadedStrings的一部分) .现在有了OverloadedLists,未来版本的数据结构很可能能够避免中间列表。 -
这里要考虑的另一件事是 GHC 本身有一个 list fusion optimization 这样,当一个“好消费者”函数应用于“好生产者”的结果时,运行时创建一个中间名单被淘汰。像
[1, 2, foo]这样的显式列表有资格成为优秀的生产者。一个特定的fromList函数是否是一个好的消费者取决于它是如何实现的;这里没有一般规则,只有实现细节。
标签: haskell data-structures compile-time