2011-09-21 1 views
10

필자는 설명서에있는 내용이 누락 된 것 같지만 실제로는 이해할 수 없습니다. 대부분 시행 착오를 거쳐 스칼라에게 직접 가르치고 있습니다.옵션 다루기 및 양쪽 유형 - 관용구 전환?

주어진 함수의 f: A => C, 관용적 인 다음 변환을 수행하는 방법은 무엇입니까?

Either[B, A] -> Either[B, C]

Either[A, B] -> Either[C, B] (나는이 개 같은 기능을 가지고 양쪽을 변환 할 경우에, 나는 한 번에 모든 것을 할 수 있습니다 또는 나는 두 번 순차적으로 관용구를 적용해야합니까?)

Option[A] -> Option[C]

(나는 어쨌든 for (...) yield을 사용한다고 생각하고 있으며, 아마도 그저 공백으로 답을 볼 때 바보가 될 것입니다.)

그리고 정확히Either의 "투영"입니다.

+1

아래의 설명에서 '쌍'과 '투플 2'를 혼동하는 것처럼 보입니다. 사실이 아닙니다. '둘다'는 _one_ 값만 포함 할 수 있습니다. 어떤 의미로 C의'union '과 비슷하지만, 실제로 어떤 멤버가 저장되었는지는 알지 못한다. –

+0

나는 그것을 알고 있지만, 혼란 스러울 정도로 혼란스러워 보인다. 나는 그 것을 분명하게 표현하지 못했다. –

답변

18

당신은 할 중 하나 :

either.left.map(f) 

나 :

either.right.map(f) 

당신은 또한 사용할 수에 대한-이해 : for (x <- either.left) yield f(x) 여기

map에 일을 더 구체적인 예입니다 an Either[Boolean, Int] :

scala> val either: Either[Boolean, Int] = Right(5) 
either: Either[Boolean, Int] = Right(5) 

scala> val e2 = either.right.map(_ > 0) 
either: Either[Boolean, Boolean] = Right(true) 

scala> e2.left.map(!_) 
either: Either[Boolean, Boolean] = Right(true) 

편집 :

어떻게 작동합니까? Either[A, B]이 있다고 가정 해 보겠습니다. left 또는 right을 호출하면 Either[A, B] 개체를 보유하는 래퍼 인 LeftProjection 또는 RightProjection 개체가 만들어집니다. left 랩퍼

함수 f: A => C와 후속 mapEither[A, B] Either[C, B] 변환에 적용된다. 후드 아래에서 패턴 일치를 사용하여 Either이 실제로 Left인지 확인합니다. 이 경우 새 Left[C, B]이 생성됩니다. 그렇지 않은 경우 변경된 내용 만 동일한 기본 값을 갖는 새로운 Right[C, B]을 만듭니다.

right 래퍼의 경우와 반대의 경우도 마찬가지입니다. 효과적으로 either.right.map(f)을 말하는 것은 - (Either[A, B]) 개체 중 하나가 Right 값을 보유하고 있으면 매핑합니다. 그렇지 않은 경우에는 그대로 두되 두 객체의 유형 B을 매핑 한 것처럼 변경하십시오.

기술적으로 이러한 예상치는 단순한 래퍼입니다. 의미 적으로는 Either 개체에 저장된 값이 Left 또는 Right 인 것으로 가정하는 것을 말하는 것입니다. 이 가정이 잘못된 경우 매핑은 아무 것도하지 않지만 형식 매개 변수는 그에 따라 변경됩니다.

+0

어떻게 작동합니까? 그 투영과 관련이 있니? 분명히 여기에'.left'와'.right'는 다른 언어에서 라이브러리 쌍 "형식"과 유사하지 않습니다. 라이브러리 형식에서는 [A]와 [B] 유형의 멤버에 각각 액세스합니다. –

+0

당신은 그 질문을보실 수 있습니다 : http://stackoverflow.com/q/7131076/754787 –

+0

나는 두포에서 일어나는 일들에 대한 약간의 해답을 편집했습니다. 그러나이 중 하나는 쌍 또는 튜플 유형이 아니며 교차 유형 ('A x B')이라고도합니다. 그것은 유형 [A] 또는 [B] - A V B 중 하나를 보유합니다. 즉, 하나의 멤버 만 있기 때문에 튜플 에서처럼 두 멤버에 안전하게 액세스 할 수 없습니다. – axel22

3

f: A=>BxOpt: Option[A]을 입력하면 xOpt map fOption[B]이됩니다.

을 감안할 때 f: A=>BxOrY: Either[A, C], xOrY.left.map(f)는, 매핑 단지 첫 번째 구성 요소 찾고있는 Either 생산; 마찬가지로 RightProjectionEither입니다.

두 가지 기능이있는 경우 두 구성 요소에 대한 매핑을 모두 정의 할 수 있습니다 (xOrY.fold(f, g)).

0
val e1:Either[String, Long] = Right(1) 
val e2:Either[Int,Boolean] = e1.left.map(_.size).right.map(_ >1) 
// e2: Either[Int,Boolean] = Right(false)