2017-04-10 20 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({{rhs.lazy.map {y in(x、y)}}})))' – Alexander

+0

ありがとうございます。私はLazySequenceを取得します。、LazyMapSequence 、(Int、Int)>>>>私はバンと同じようにIntで試しました。 –

答えて

4

あなたは 基礎となるシーケンスの詳細を隠して同じElementタイプを有する下地ベース 配列の前方にどの事業、type-erased sequenceを作成することができます。そして、あなたのコードは、実際とは無関係です

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 
} 

を思い付きました。