func <^> (@noescape f: T -> U, a: T?) -> U? { return a.map(f) } func <*> (f: (T -> U)?, a: T?) -> U? { return a.apply(f) } func >>- (a: T?, @noescape f: T -> U?) -> U? { return a.flatMap(f) } extension Optional { func apply(f: (Wrapped -> U)?) -> U? { return f.flatMap { self.map($0) } } } func pure(a: T) -> [T] { return [a] }