2017-04-10 116 views
1

我已經在迅速斯威夫特懶笛卡爾積

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,但返回類型應該是什麼?還是有更好的或其他的方式來做這樣的事情?

+0

選項點擊'lhs.lazy.flatMap'中的'flatMap',全部顯示。或者只是'print(type(of:lhs.flatMap {{in rhs.lazy.map {y in(x,y)}}))' – Alexander

+0

非常感謝。我得到LazySequence ,LazyMapSequence ,(Int,Int)>>>>。我在你看到的時候用Int來試試它。 –

回答

4

您可以創建一個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及其確切的返回類型(甚至可能會更改爲 較新的Swift版本)。

0

感謝亞歷山大,我想出了

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 
} 

這一工程,但不知是返回類型似乎有點太多對我的口味。