 		return .None
 	}
 }
-
-/// liftM2 :: Monad m => (a -> b -> r) -> m a -> m b -> m r
-///
-/// Like `bind` but good if you have 2 Optionals instead of one.
-///
-/// liftM2(curry(+))(.Some(4))(.Some(5)) == .Some(9)
-
-///This gives a bad access error in the playground as of Beta 5
-//public func liftM2<A, B, R>(f: A -> B -> R) -> A? -> B? -> R? {
-//  	return { a in { b in a >>- { ap in b >>- f(ap) }}}
-//}

	}
}

/// Applicative Functor `apply`. Given an Optional<A -> B> and an Optional<A>,
/// returns an Optional<B>. If the `f` or `a' param is None, simply returns None.
/// Otherwise the function taken from Some(f) is applied to the value from Some(a)
/// And a Some is returned.
public func <*><A, B>(f: (A -> B)?, a: A?) -> B? {
	if f != nil && a != nil {
		return (f!(a!))

//  Copyright (c) 2014 Maxwell Swadling. All rights reserved.
//

/// Lifts a value into an Optional.
public func pure<A>(a: A) -> A? {
	return .Some(a)
}

/// Fmap | If the Optional is None, ignores the function and returns None. If the Optional is Some, 
/// applies the function to the Some value and returns the result in a new Some.
public func <^><A, B>(f: A -> B, a: A?) -> B? {
	if let x = a {
		return (f(x))
