具有关联类型的Functor协议的实现(Swift)

Ale*_*nko 2 functional-programming ios swift swift-protocols

我正在尝试在Swift中实现一个Functor,并且发现我无法为返回类型的泛型map函数指定不同的关联类型.请在我错的地方提出建议.

这是我的代码:

protocol Functor {
 associatedtype T

 func map<U>(_ transform: (T) -> U) -> Self // should return `Self` with associated type U
}

enum Result<A>: Functor {
 typealias T = A

 case success(A)
 case failure(Error)

 func map<U>(_ transform: (A) -> U) -> Result<A> { // autocompletion sets return type as `Result<A>` instead of Result<U>
  switch self {
  case let .success(value):
   return .success(transform(value))
  default:
   return self
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*sch 5

当您打算Functor通过应用更改您的关联类型时map,返回类型不能Self在您的协议定义中.这可以通过使返回类型是另一个相关类型来解决,该类型也是Functor(并且可以是Self默认情况下)可以自由选择的类型是否是通用的.像这样的东西:

protocol Functor {
    associatedtype A
    associatedtype B: Functor = Self

    func map<C>(_ transform: (A) -> C) -> B where B.A == C
}

enum Result<Value>: Functor {
    typealias A = Value

    case success(Value)
    case failure(Error)

    func map<C>(_ transform: (A) -> C) -> Result<C> {
        switch self {
        case let .success(value): return .success(transform(value))
        case let .failure(error): return .failure(error)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)