2017-03-13 4 views
1

스칼라에서 나는 Array[Option[(String,String,Try[String])]]을 가지며 모든 오류 오류 코드를 찾고 싶습니다.중첩 된 스칼라 필터 Option/Try 모나드

for { 
    Some(row) <- row 
    (a,b,c) = row 
    x <- c 
} yield x 

을하지만 내부 모나드가 실패 인 경우, 그때 나는 사투를 벌인거야 :

내부 모나드가 대신 Option[String] 경우, 정말 같은 이해를 위해 깨끗한 작은으로 Some(x) 내용에 액세스 할 수 있습니다 for 문에 Failure(x) <- c을 넣을 수 없으므로 패턴 일치 방법을 살펴보아야합니다. 이것은 내가 누락 된 정말 간단한 것 같지만, 어떤 지침도 매우 가치있을 것입니다.

감사합니다.

EDIT - 배열을 잘못 지정했습니다. 실제로는 tuple3s뿐만 아니라 option-tuple3s의 배열입니다.

답변

3

a.map(_._3).filter(_.isFailure)합니까?

편집 : 편집 및 의견을 참조 가진 후, 난 당신이 또한 내가 그것에 대해 생각하지 않았다

val tries = for { 
    x <- a 
    z <- x 
} yield z._3 

tries.filter(_.isFailure) 
+0

감사합니다. 그게 바로 이해와 일치 프로토콜을 overthinking하여 놓친 간단한 대답이야. 옵션을 제거하기 위해 처음에는 flatMap을 추가해야했습니다 (편집 참조). – buggaby

+0

아아 ... 편집을 보지 못했습니다 ... a.flatMap (x => x.map (_._ 3)). filter (_. isFailure)'와 같은 일을해야만합니까? – mfirry

+0

정확합니다. 방금 옵션 부분을 제거해야했습니다. 모나드로이 작업을 수행하는 더 좋은 방법이있을 것이라고 생각합니다. 그러나 작동 중이고 전체 솔루션을 재 작업하여 조금 깔끔하게 만들지 않으려 고합니다. – buggaby

2

이렇게하면 Array[Throwable]이 반환됩니다.

for { 
    (_,_,Failure(e)) <- rows 
} yield e 

또는 아마도 설탕이없는 버전 일 수 있습니다.

rows.collect{case (_,_,Failure(e)) => e} 
3

다른 유형의 "모나드"를 결합하려면 모나드 변환기가 필요합니다. 이를 간단히 말하면, 스칼라는 같은 모달 내에서 다른 모나드 유형을 혼합 할 수는 없습니다. 이는 이해를 돕기 위해 map/flatMap/filter의 조합에 대한 통사론적인 설탕을 의미합니다.

Option 다음은 OptionTry 변환하고 원하는 결과를 얻을 수 항상 첫 번째입니다 가정 : 당신이 정말 괜찮아요 그 Try 내부의 일에 대해 걱정하지 않는 경우

for { 
    Some((a, b, c)) <- row 
    x    <- c.toOption 
} yield x 

을하지만, 그렇다면 Some(x)을 할 때 그 정보를 잃어 버릴 것을주의하십시오. 패턴 일치가 실패하면 None이 표시됩니다.

여러분을 돕기를 바랍니다.

+0

할 수 있다고 생각합니다. 모나드 조합 제한에 대한 좋은 지적. 나는 실패 내용이 필요하다. 그래서 이것은 나를 위해 일하지 않는다. 그러나 그것은 알고있는 것이 매우 도움이된다. 감사. – buggaby

+0

그 경우 패턴 일치를 사용하는 것이 좋습니다. 가장 깨끗한 해결책입니다. –

관련 문제