Swift 的标准库是否包含 list anamorphism对于 Sequence
或类似的东西?
列表或序列上的变形与 reduce
相反功能。因此,它不会将序列折叠成单个值,而是向上构建序列。
reduce
接受一个初始值和一个用于将序列元素与此组合的函数,并返回一个最终值。它的签名看起来像这样(为了便于阅读而添加了换行符):
public func reduce<Result>(
_ initialResult: Result,
_ nextPartialResult: (Result, Self.Element) throws -> Result) rethrows
-> Result
序列的变形可能是这样的:
func inflate<State, Element>(
_ initialState: State,
_ generator: @escaping (State) -> (State, Element)?)
-> AnamorphismSequence<State, Element>
通过给它一些初始状态,并告诉它如何将其转换为一个元素和下一个状态,它可以为您构建一个序列。所以,我可以获得一个数组,例如 Array(1..<10)
像这样:
Array(inflate(1) { s in s < 10 ? (s+1, s) : nil })
最佳答案
Swift 对此有两种变体。这两种类型都有私有(private)初始化器,但它们可以使用各自的全局函数生成。
后者不做任何前者不能做的事情。它只是一个简化版本,当您不需要单独的状态时使用它,而不仅仅是知道前一个元素是什么。
这是你的 1..<10
示例可以实现,使用两种方法:
Array(sequence(first: 1) { i in (i < 9) ? (i + 1) : nil })
Array(sequence(state: 1) { state -> Int? in
defer { state += 1 }
return state < 10 ? state : nil
})
您的示例更适合更简单的 sequence(first:next:)
.后者对于生成完美正方形的序列之类的东西更有用:
* 您的维护状态将是完美正方形的正方形(每次展开都会增加 1)
* 您的序列通过将该状态乘以自身(对其进行平方)来生成它的元素
从技术上讲,您可以使用捕获的局部变量来模拟 UnfoldSequence
的状态,但这有点困惑,而且几乎肯定更慢。
关于快速序列变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57279973/