在Haskell中,使用typeclass
时,很容易声明其“实例”类型类型的约束。
class Functor (f :: * -> *) where
...
* -> *
代表HKT(高级类型),这意味着符合Functor
的任何类型都必须是HKT。
如何使用Swift的protocol
实现这一目标?
答案 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))
}
}
}