protocol Monad<M<_>> {
    static func pure<A>(_ value: A) -> M<A>
    
    static func flatMap<A, B>(_ ma: M<A>, _ f: (A) -> M<B>) -> M<B>
}