Как объявить протокол для HKT в Swift? - PullRequest
0 голосов
/ 20 октября 2018

В Haskell, при использовании typeclass, легко объявить ограничение типа его экземпляров.

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

* -> * представляет HKT (высшие типы), это означает, что любой тип, соответствующий Functor, должен быть HKT.

Как мне добиться этого с помощью protocol Swift?

1 Ответ

0 голосов
/ 20 октября 2018

Swift изначально не поддерживает HKT как форму типа, но вы можете смоделировать ограничение с помощью трюка associatedtype:

public protocol Functor {
    /// (* -> *)
    associatedtype FA: Functor = Self
    /// *
    associatedtype A
    /// fmap
    func fmap<B>(_ f: ((A) -> B)) -> FA where FA.A == B
}

и примера соответствия:

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

extension Maybe: Functor {
    func fmap<B>(_ transform: ((A) -> B)) -> Maybe<B> {
        switch self {
        case .nothing:
            return .nothing
        case .just(let v):
            return .just(transform(v))
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...