func yetAnotherProblem(input: Double) -> ProblemHiding<Int> let input = 42 ProblemHiding(input) // udajemy że wszystko gra .execute(canCauseProblem) // jakby nic się nie stało .execute(possibleProblem) // bez nerwów, bez ifów .execute(yetAnotherProblem) // jak kwiat lotosu .obtainValue() // sprawdzam!
B = Any // nil jest problemem typealias FB = B? func bind<B>(f: A -> B?) -> B? { return self.flatMap(f) } } extension Array : Monad { typealias A = Element typealias B = Any // wiele wartości to problem typealias FB = Array<B> func bind<B>(f: A -> [B]) -> [B] { return self.flatMap(f) } }
case Failure(ErrorType) } extension Result : Monad { typealias A = Value typealias B = Any typealias FB = Result<B> func bind<B>(f: A -> Result<B>) -> Result<B> { switch self { case .Success(let value): return f(value) case .Failure(let error): return .Failure(error) } } }