2014-11-26 5 views
1

제로와 mappend을 가지고 있다는 것이 각각옵션 [Monoid [T]] 매퍼드 작업을 처리하는 좋은 방법이 있습니까? I는 모노 이드 [T]를 가지고 있다면

implicit myMonoid: Monoid[T] = ... 

val x: T = thing() 
val y: Option[T] = none[T] 
val z: Option[T] = Some(value) 

val a: T = x.mappend(y) 
val b: T = x.mappend(z) 

val i: T = y.mappend(x) 
val j: T = z.mappend(x) 
A의

및 B의 결과가 ID 및 x.mappend (z.get)되어야한다고 논리적 저 보인다 . i와 j도 마찬가지입니다. 이 표현하는 기존의 구조가 있습니까

def combine(a: Option[T], b: Option[T]) = { 
    a match { 
     case None => b 
     case Some(x) => x |+| b.getOrElse(myMonoid.zero) 
    } 
} 

, 또는이 수학적으로 올바르지 않습니다

는 내가 지금 가지고하는 것 같습니다? 내가 틀리지 않는 경우

답변

2

def combine[T: Monoid](a: Option[T], b: Option[T]) = a |+| b 

작동합니다 간단 Option위한 모노 이드가 있어야한다.

+0

''''''을 결합하지 않은 규칙적인 "첫 번째" '가치있는'모노 노드가 아닙니까? Haskell 언어에서 OP는'liftA2 mappend '를 찾고 있습니다. 즉'Option'이 적용 가능한 functor 또는 'mappend'를 들어 올리는 모나드라는 사실을 사용할 수 있습니다. Scala를 더 잘 알기를 바랍니다. – luqui

+0

@luqui 미안하지만, 나는 처음 무엇인지 이해하지 못한다. 어떤 가치 monoid. 만약 내가 'Option'이 무료 monoid (예를 들어 List)라고 오해하지 않는다면 실제 타입이 monoid (즉, T : Monoid)가되어야하기 때문에 두 arg가 모두 'Some'이고'mappend'를 적용하면 – 4lex1v

+0

아 - 예 - 물론 옵션 [T] 자체에는 Monoid가 있습니다! – PlexQ