class Kind<F, A> {}

protocol Monad {
    static func pure<A>(_ value: A) -> Kind<Self, A>

    static func flatMap<A, B>(
      _ ma: Kind<Self, A>, 
      _ f: @escaping (A) -> Kind<Self, B>
    ) -> Kind<Self, B>
}

Explanation:

While the definition here isn't too much worse than the other versions, actual
implementations are far worse, both in terms of verbosity and safety, as seen by 
the `Mappable` example at the start of the article.