在尝试在Swift中实现一个简单的惰性列表时,我尝试在Swift中为枚举创建一个扩展,里面有一个泛型方法(模拟类似类的行为,因为我在尝试Swift时是一个Scala开发人员大部分时间),像这样:
enum LazyList<A>{
case Elem(x: A, xs: () -> LazyList<A>)
case Nil()
}
extension LazyList {
func map<B>(f: (A) -> B) -> LazyList<B> {
func lazyMap(l: LazyList<A>, lf: (A) -> B) -> LazyList<B> {
switch l {
case let .Elem(e, es):
return LazyList.Elem(x: lf(e), xs: {() -> LazyList<B> in return lazyMap(es(), lf: lf)})
case .Nil:
return LazyList.Nil()
}
}
return lazyMap(self, lf: f)
}
}
然而,这不会在操场上运行,无法编译,错误如下:
error: cannot convert value of type 'LazyList<A>' to expected argument type 'LazyList<_>'
return LazyList.Elem(x: lf(e), xs: {() -> LazyList<B> in return lazyMap(es(), lf: lf)})
我怎样才能编译它?是因为编译器无法推断lazyMap
的返回类型?
答案 0 :(得分:1)
只需删除&#34; LazyList。&#34;来自您的交换机案例:)
enum LazyList<A>{
case Elem(x: A, xs: () -> LazyList<A>)
case Nil()
}
extension LazyList {
func map<B>(f: (A) -> B) -> LazyList<B> {
func lazyMap(l: LazyList<A>, lf: (A) -> B) -> LazyList<B> {
switch l {
case let .Elem(e, es):
return .Elem(x: lf(e), xs: {() -> LazyList<B> in return lazyMap(es(), lf: lf)})
case .Nil:
return .Nil()
}
}
return lazyMap(self, lf: f)
}
}