【发布时间】:2017-08-16 14:17:45
【问题描述】:
以下代码可在合理时间内自行编译EXAMPLE:
public struct LazyProduct6Sequence <
T1: LazySequenceProtocol, T2: LazySequenceProtocol, T3: LazySequenceProtocol,
T4: LazySequenceProtocol, T5: LazySequenceProtocol, T6: LazySequenceProtocol
>: LazySequenceProtocol {
public typealias Element = (T1.Element, T2.Element, T3.Element, T4.Element, T5.Element, T6.Element)
public typealias Iterator = AnyIterator<Element>
private let iterator: Iterator
internal init (
_ sequence1: T1, _ sequence2: T2, _ sequence3: T3,
_ sequence4: T4, _ sequence5: T5, _ sequence6: T6
) {
self.iterator = AnyIterator(
sequence1.flatMap { element1 in
sequence2.flatMap { element2 in
sequence3.flatMap { element3 in
sequence4.flatMap { element4 in
sequence5.flatMap { element5 in
sequence6.map { element6 in
(element1, element2, element3, element4, element5, element6)
}
}
}
}
}
}.makeIterator()
)
}
public func makeIterator () -> Iterator {
return self.iterator
}
}
public func product <
T1: LazySequenceProtocol, T2: LazySequenceProtocol, T3: LazySequenceProtocol,
T4: LazySequenceProtocol, T5: LazySequenceProtocol, T6: LazySequenceProtocol
> (
_ sequence1: T1, _ sequence2: T2, _ sequence3: T3,
_ sequence4: T4, _ sequence5: T5, _ sequence6: T6
) -> LazyProduct6Sequence<T1, T2, T3, T4, T5, T6> {
return LazyProduct6Sequence(sequence1, sequence2, sequence3, sequence4, sequence5, sequence6)
}
但是,在编译使用它的代码时,大约需要 40 秒才能编译(或根本拒绝编译)EXAMPLE:
_ = product([1, 2].lazy, [3, 4].lazy, [5, 6].lazy, [7, 8].lazy, [9, 10].lazy, [11, 12].lazy)
为什么编译需要这么长的时间?
【问题讨论】:
-
长编译时间通常与类型推断的复杂性有关。尝试为每个闭包注释闭包参数
{ (element1: T1.Element) in的类型。 -
@AllenHumphreys:肯定与类型推断有关,是的。为每个闭包添加显式返回类型并没有太大帮助,因为编译时间几乎保持不变。但是,当我将显式类型添加到使用该函数 (example) 的赋值中时,编译时间几乎是瞬时的。
-
这是一个非常痛苦的陈述,但我不确定在提供的示例中还有哪些改进空间。不幸的是,类型推断总是导致 Swift 编译时间问题的原因。我不确定其他具有强类型和推理的语言如何,但我想它是相似的?
-
@AllenHumphreys:我仍在尝试找出编写惰性函数的最佳方法,因此可能有更好的方法没有这个问题。但我认为这一定是某种错误。我会提交错误报告。
标签: swift functional-programming lazy-evaluation type-inference swift4