2014-10-23 3 views
4

내가 알 수있는 한 Scalaz의 \/에는 get 방법이 없습니다. 때로는 \/에 포함 된 값이 올바른 값이고, getOrElse을 사용하고 싶지 않은 경우도 있습니다. 나는 그것을 직접 얻고 싶다.Scalaz는 왜 getOrElse를 가지고 있지만 얻지 못합니까?

("3".right[Int]) getOrElse("123123123") // 3 

if (t.isRight) t.get // compilation error, no get method 

올바른 값을 보장받을 수있는 경우 어떻게 얻을 수 있습니까?

값을 얻을 수있는 방법은 두 가지가 있지만 둘 다 조금 자세하게 표시됩니다.

1 : 변화 스칼라 어느

val t = "3".right[Int] 
val either = t.toEither 

if (either.isRight) either.right.get 
else either.left.get 

2 : getOrElse

("3".right[Int]) getOrElse("123123123") // but for some cases I don't have this default value 
+0

지도 방법이 있습니까? – Basilevs

+0

하지만지도는 여전히 올바른 투영법을 사용하지만지도의 반환 유형은 올바른 값의 유형 대신 여전히 \/유형입니다. –

+0

안전하지 않은 get을 수행해야한다면'getOrElse (sys.error ("No such"))'와 같은 것을 할 수 있습니다. 이것은 실제로 get을하는 것과 동일하지만 아무런 값도 없을 때 일어나는 일에 대해 더 명백하게 표현합니다. (=> 예외) –

답변

5

시원하지 않은 예외를 던질 수 얻을로 더 GET이 없습니다 . Scalaz는 값에 직접 액세스하지 못하도록함으로써 이것을 강제합니다.

자세한 정보를 제공하면 해결 방법을 찾을 수 있습니다.

t should be safe. 

val safe_thing:T = ??? 
val either: Throwable \/ T = getFromSomewhere 

either getOrElse safe_thing 
+0

나는 그렇게 생각하지 않는다. 나의 이해는 만약 그것이 맞다면 어느 쪽이든 이미 체크가되어 있다면 직접 받아 들여야한다. 또한 getOrElse (t), t는 예외를 발생시킬 수 있습니다. –

+0

안전해야합니다. val safe_thing : T = ??? val : Throwable \/T = getFromSomewhere – Jonoabroad

+1

@Cloudtech 어떻게 확인합니까? 패턴 일치를 통해? 그런 다음 이미 가치가 있습니다. – jilen

0

다른 답변이 지적한 바와 같이, get 던져. 그러나 OP와 마찬가지로 유형 (이 경우 \/-)이 확실한 경우도 발생했지만 코드의 변수는 \/ (수퍼 클래스)이었습니다.

인라인 패턴 매칭을하는 것은 매우 장황하고 나 빠졌습니다. getLeft 같은 방식으로 구성 할 수있다 필요

println("test".right.getRight.toUpperCase) // outputs: TEST 

경우 : 여기 예제,

implicit class ScalazDisjunctionPimps[A, B](e: \/[A, B]) { 
    def getRight: B = e match { 
     case \/-(x) => x 
     case _ => throw new RuntimeException(s"$e is not right.") 
    } 
    } 

사용법은 간단하다 :

println(("test".right[String] |> { case \/-(x) => x; case _ => "" }).toUpperCase) 

그래서 나는이 도우미를 썼다.