iOS
[함수형 프로그래밍] Maybe & Either
min_ee
2020. 4. 10. 23:39
Maybe
- 값의 부재 가능성을 표현
- funtor이자 monad
- 값이 nil로 변할 가능성이 없는 transform의 경우 map사용(functor)
- 값이 nil로 변할 가능성이 있는 transform의 경우 flapMap사용(monad)
- Optional 이 곧 maybe
enum Maybe<A> {
case None
case Some(A)
static func pure<B>(_ value: B) -> Maybe<B> {
return .Some(value)
func flapMap<B>(_ f: (A) -> Maybe<B>) -> Maybe<B> {
switch self {
case .None:
return .None
case .Some(let value):
return f(value)
}
}
func map<B>(f: (A) -> B) -> Maybe<B> {
reutrn self.flatMap { type(of: self).pure(f($0)) }
}
}
Either
- 어떤 값이 두가지 타입을 가질 수 있는 경우를 표현
- 우리가 자주 사용하는Result가 Either
enum Either <R, L> {
case right(R)
case left(L)
}
- right는 Int, left를 가짐
// right를 사용하는 경우
var either: Either<Int, String> = .right(3)
swithch either {
case .right(let r):
print(r)
case .left(let l):
print(l)
}
- Optional로 예외 처리 할 수 있지만 optional은 실패했음을 표현할 수 있지만 어떤 에러가 발생했는지 알 방법이 없음
enum Either<A, B> {
case Left(A)
case Right(B)
static func pure<C>(_ value: C) -> Either<A, C> {
return Either<A, C>.Right(value)
}
func flapMap<D>(_ f: (B) -> Either<A, D>) -> Either<A, D> {
switch self {
case .Left (let x):
return Either<A, D>.Left(x)
case .Right(let x):
return f(x)
}
}
func map<C>(f: (B) -> C) -> Either<A, C> {
return self.flapMap { Either<A, C>.pure(f($0)) }
}
}