如何快速为HKT声明协议?

时间:2018-10-20 12:08:25

标签: swift haskell functional-programming

在Haskell中,使用typeclass时,很容易声明其“实例”类型类型的约束。

class Functor (f :: * -> *) where
  ...

* -> *代表HKT(高级类型),这意味着符合Functor的任何类型都必须是HKT。

如何使用Swift的protocol实现这一目标?

1 个答案:

答案 0 :(得分:3)

Swift本身不支持将HKT作为类型形式,但是您可以使用associatedtype技巧来模拟约束:

protocol Functor {
    /// (* -> *)
    associatedtype FunctorT: Functor = Self
    /// *
    associatedtype FunctorTT
    /// fmap
    func map<T>(_ transform: ((FunctorTT) -> T)) -> FunctorT where FunctorT.FunctorTT == T
}

以及一致性示例:

enum Maybe<T> {
    case just(T)
    case nothing
}

extension Maybe: Functor {
    typealias FunctorTT = T
    func map<U>(_ transform: ((T) -> U)) -> Maybe<U> {
        switch self {
        case .nothing:
            return .nothing
        case .just(let v):
            return .just(transform(v))
        }
    }
}