Swift惰性笛卡尔积

6
我在 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,但返回类型应该是什么呢?或者是否有更好的或其他方法来实现类似的功能?


lhs.lazy.flatMap 中选中 flatMap,一切就会显现。或者只需运行 print(type(of: lhs.flatMap({ x in rhs.lazy.map{y in (x,y)}}))) - Alexander
非常感谢。我得到了 LazySequence<FlattenSequence<LazyMapSequence<CountableClosedRange<Int>, LazyMapSequence<CountableClosedRange<Int>, (Int, Int)>>>>。我已经尝试了使用 Int,正如你所看到的。 - Remco Greve
2个回答

9
你可以创建一个类型擦除序列,它将其操作转发到具有相同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 和其确切返回类型无关(甚至可能随着新版本的 Swift 而改变)。


0

感谢 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
}

这个可以用,但是那个返回类型对我来说有点过于复杂了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接