快速序列变形

标签 swift sequence anamorphism

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. UnfoldSequence<Element, State> ,由 sequence(state:next:) 制作

  2. UnfoldFirstSequence<Element> sequence(first:next:) 制作

后者不做任何前者不能做的事情。它只是一个简化版本,当您不需要单独的状态时使用它,而不仅仅是知道前一个元素是什么。

这是你的 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/

相关文章:

从 Swift 字符串转换为 const char*

ios - 修改导航 Controller 中所有 ViewController 的高度

c# - 什么是变形,它在 C# 中是什么样子的?

parsing - 具有变形的 Haskell monadic 解析器

ios - 按返回后,表格 View 顶部导航栏的空间增加

ios - 它是如何运作的

f# - 序列 "reverse-engineering"的模式

string - 字符串 B 在 A 的子字符串中的最佳对齐方式 -- 生物信息学

python - 用于计算序列的第 n 个元素的脚本