表示两种可能类型之一的值(一个不相交的联合。)
Either 的实例要么是 Left 的一个实例,要么是 Right 的一个实例。
Swift Either 类型类似于 scala.util.Either
++ \/ - scalaz.\/
决定是否需要 Right Projection。
struct Error {
var reason: String
init(_ reason: String) { self.reason = reason }
}
let resultL = Either<Error, String>.left(Error("failed"))
let resultR = Either<Error, String>.right("ok")resultR.isRight // true
resultR.isLeft // false~Either<String, String>.left("failed") ?? "fallback" // failed// Alias for Right Projection.getOrElse
resultL ?? "fallback" // fallback
resultR ?? "fallback" // success// Right Projection
resultL ||| "ok" // .Right("ok")
Either<Error, String>.left(Error("failed1")) ||| resultL ||| resultR // .Right("ok")// Alias for Right Projection.map
resultR.map { "\($0)!" } // .Right("ok!")
resultL.map { "\($0)!" } // .Left(Error("failed"))func isFull<T>(string: String) -> Either<T, Bool> {
return .right(!string.isEmpty)
}
(resultL >>- isFull).fold(
{ e in e.reason},
{ s in s.description }
)
// failed
(resultR >>- isFull).fold(
{ e in e.reason},
{ s in s.description }
)
// truefold<X>(fa: A -> X, fb: B -> X) -> Xswap() -> Either<B, A>getOrElse(or: () -> B) -> B Right ProjectionorElse(or: () -> B) -> Either<A, B> Right ProjectionorElse(or: () -> Either<A, B>) -> Either<A, B> Right Projectionmap<X>(f: B -> X) -> Either<A, X> Right ProjectionflatMap<X>(f: B -> Either<A, X>) -> Either<A, X> Right Projectionleft(value: A) -> Either<A, B>right(value: B) -> Either<A, B>cond<A, B>(test: Bool, right: () -> B, left: () -> A) -> Either<A, B>getOrElse(or: () -> A) -> Aforeach<U>(f: A -> U)forall(f: A -> Bool) -> Boolexists(f: A -> Bool) -> Boolmap<X>(f: A -> X) -> Either<X, B>flatMap<X>(f: A -> Either<X, B>) -> Either<X, B>filter(p: A -> Bool) -> Either<A, B>?toOption() -> A?