2013-11-10 2 views
2

나는 한 쌍의 Option[Int]을 가지며 둘 다 존재하는 경우 두 값의 최소값을 찾고, 그렇지 않으면 두 값 중 하나만 찾으려고합니다.scalaz를 사용하는 함수를 통해 Option [Int] 쌍의 조건부 맵

(Some(a), Some(b)) => Some(Math.min(a,b)) 
(Some(a), None) => Some(a) 
(None, Some(b)) => Some(b) 
(None, None) => None 

이 작업을 수행 할 수있는 간단한 방법이 있을까요 :

def minOption(a: Option[Int], b: Option[Int]): Option[Int] 

내가 원하는 것은 출력 입력의 다음 매핑은 다음과 같습니다의 내가 함수 minOption 있다고 가정 해 봅시다? 중첩 패턴 일치를 사용하는 분명한 방법과는 다른 것을 생각해 낼 수 없습니다.

나는이 것이 scalaz에서 하찮은 것이어야한다고 생각 하겠지만, 아직 익숙하지는 않았고 방법을 찾지 못했습니다. 최소 발 선택 Tags.MinVal 태그 것들에 대한 반군이

답변

6

: 위에서

scala> import scalaz._ ; import Scalaz._ ; import Tags._ 
import scalaz._ 
import Scalaz._ 
import Tags._ 

scala> MinVal(3).some |+| MinVal(1).some 
res0: Option[[email protected]@[Int,scalaz.Tags.MinVal]] = Some(1) 

scala> MinVal(3).some |+| none[Int @@ MinVal] 
res1: Option[[email protected]@[Int,scalaz.Tags.MinVal]] = Some(3) 

scala> none[Int @@ MinVal] |+| none[Int @@ MinVal] 
res2: Option[[email protected]@[Int,scalaz.Tags.MinVal]] = None 

Int @@ MinVal 함께 "태그"된 Int의 하위 유형이있는 유형입니다 MinVal, 올바른 반 그룹을 선택하는 데 도움이됩니다. MinVal(x: Int)Int @@ MinVal 유형의 x를 반환합니다. 유형을 제외하고 Some(x) 대신 SomeOption이며,이 유사하게, none[T] 반환 None (안 일부 거기 반군은 옵션입니다,하지만) 타입 추론에 도움이되지만 그 유형이에 도움이 Option[T] 대신 None (처럼 x.some이다 같은 이유로, 없음에 대한 반군이 없지만, 아마도 당신이 이들의 목록을 가지고, 두 개 이상있는 경우 옵션의 하나)

이, 당신이 사용할 수있는 suml :

scala> List(MinVal(2).some, None, MinVal(3).some, None, MinVal(1).some).suml 
res5: Option[[email protected]@[Int,scalaz.Tags.MinVal]] = Some(1) 
+0

우수합니다. 고맙습니다! – Watto

3

I 돈 당신의 옵션이 Scalaz가 필요하다고 생각하지 않습니다. n 목록 (varargs를 사용하여 작동)

def findMinOpt(li: List[Option[Int]]): Option[Int] = 
    { 
     val listwithoutOptions = li.flatten 
     listwithoutOptions.reduceLeftOption(_ min _) 
    } 


def findMinOptVarArgs(li: Option[Int]*): Option[Int] = 
    { 
     val listwithoutOptions = li.flatten 
     listwithoutOptions.reduceLeftOption(_ min _) 
    } 
+1

당신이 다시 구현하려고한다면 스칼라즈가 전혀 필요하지 않습니다. 괜찮은 코드를 사용해 주셔서 감사합니다. – OlegYch

+0

두 개의'Option' 값만 가질 것이므로'Int'를 가진'Option' 값을 가질 것입니다. 'MinVal' 태그가 더 나은 방법입니다. 그러나 어쨌든 고마워. – Watto

관련 문제