【发布时间】:2017-03-05 06:03:32
【问题描述】:
背景和细节
Swift进化提案SE-0094在Swift 3.0中实现,引入全局sequence函数:
后者声明如下
func sequence<T, State>(state: State, next: @escaping (inout State) -> T?) -> UnfoldSequence<T, State>
并在swift/stdlib/public/core/UnfoldSequence.swift 中实现。语言参考给出了使用它的以下示例(注意缺少显式类型注释)
// Interleave two sequences that yield the same element type sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()), next: { iters in iters.0 = !iters.0 return iters.0 ? iters.1.next() : iters.2.next() })
但是,我无法让上面的示例正常工作(例如,使用 let seq1 = 1...3、let seq2 = 4...6),但会提示相当奇怪的错误消息
错误:对成员“
sequence(first:next:)”的引用不明确
只有当我在 next 闭包中显式键入注释可变的 State 参数以及它的返回类型时,上面的示例才会编译
let seq1 = 1...3
let seq2 = 4...6
for i in sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()),
next: { (iters: inout (Bool, ClosedRangeIterator<Int>, ClosedRangeIterator<Int>))
-> Int? in
iters.0 = !iters.0
return iters.0 ? iters.1.next() : iters.2.next()
}) {
print(i)
} // 1 4 2 5 3 6
然而,这不是我希望使用 sequence(state:next:) 的方式,因为我宁愿在类型推断正常工作的即时应用程序中看到它,避免所有的显式性。
问题
- 我们是否打算将
sequence(first:next:)函数与上面的显式类型注释一起使用?由于inout参数闭包,此功能是否存在一些限制,还是我遗漏了什么?
【问题讨论】:
-
@Hamish 谢谢,该错误报告将符合此行为。感谢关于通用专业化的另一点,只是在删除该点的过程中(由于其他原因)!至少我猜是裁判。
sequence(state:next:)的文档应该更新以包含inout参数的显式注释,如果只是依靠文档(而不是广泛的 SO 贡献者知识!),尝试使用该函数会非常混乱。 -
@Hamish(如果你愿意的话)你可能会在你的评论中发布信息作为答案,它似乎涵盖了我的问题中解释“限制”询问的大部分内容。
-
我已经继续并发布了一个答案 :) 虽然不幸的是,除了我在原始评论中所说的内容之外,我真的无法发现其他内容。
-
我的书apeth.com/swiftBook/ch05.html#_for_loops 的这一部分末尾有一个斐波那契实现,我必须使用显式类型注释。但我并不介意。 :) [顺便说一句,我编辑了你的标题,因为结果是 q。真的只是类型推断问题]
-
@matt 感谢您的编辑和回答!