Swift 惰性笛卡尔积

Swift lazy cartesian product

我在swift

中有这个功能
func *<T1:Sequence, T2:Sequence>(lhs: T1,rhs : T2) ->
              [(T1.Iterator.Element,T2.Iterator.Element)] 
{
    let product = lhs.flatMap({ x in rhs.lazy.map{y in (x,y)}})
    return product
}

我想让它懒惰求值。我知道我可以使用 lhs.lazy.flatmap 但 return 类型应该是什么?还是有更好的或其他方法来做这样的事情?

您可以创建一个 type-erased sequence,它将其操作转发到底层基础 具有相同 Element 类型的序列,隐藏了 基础序列:

func *<T1:Sequence, T2:Sequence>(lhs: T1,rhs : T2) -> AnySequence<(T1.Iterator.Element,T2.Iterator.Element)> 
{
    return AnySequence (
        lhs.lazy.flatMap { x in rhs.lazy.map { y in (x,y) }}
    )
}

那么您的代码独立于 lazy.flatMap 的实际实现及其确切的 return 类型(甚至可能随着 较新的 Swift 版本)。

多亏了 Alexander 我想到了

func *<T1:Sequence, T2:Sequence>(lhs: T1,rhs : T2) ->     
          LazySequence<FlattenSequence<LazyMapSequence<T1,
          LazyMapSequence<T2, (T1.Iterator.Element, T2.Iterator.Element)>>>> {
    let product =  lhs.lazy.flatMap({ x in rhs.lazy.map{y in (x,y)}})
    print(type(of:product))
    return product
}

这行得通,但不知何故 return 类型对我来说似乎有点过分了。