Swift扩展中

时间:2016-01-18 22:35:13

标签: swift generics functional-programming

在尝试在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的返回类型?

1 个答案:

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