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.