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 类型对我来说似乎有点过分了。
我在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 类型对我来说似乎有点过分了。