2017-04-10 1 views
1

J'ai cette fonction rapideSwift produit cartésien paresseux

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 
} 

Je veux faire évaluer paresseux. Je sais que je peux utiliser lhs.lazy.flatmap mais quel devrait être le type de retour? Ou y a-t-il une meilleure façon de faire quelque chose comme ça?

+0

Option cliquez sur 'flatMap' dans' lhs.lazy.flatMap' et tout sera révélé. Ou juste 'print (type (de: lhs.flatMap ({x dans rhs.lazy.map {y dans (x, y)}}))) – Alexander

+0

Merci beaucoup. Je reçois LazySequence , LazyMapSequence , (Int, Int) >>>>. Je l'ai essayé avec Int comme vous le voyez. –

Répondre

4

Vous pouvez créer un type-erased sequence, qui transmet ensuite ses opérations à une séquence de base sous-jacente ayant le même type Element, cachant les détails de la séquence sous-jacente:

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) }} 
    ) 
} 

Ensuite, votre code est indépendant du réel mise en œuvre de lazy.flatMap et son type de retour exact (qui peut même changer avec versions plus récentes de Swift).

0

Merci à Alexandre est venu avec

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 
} 

Cela fonctionne, mais en quelque sorte ce type de retour semble un peu trop cher pour mon goût.