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)
}
}
, 또는이 수학적으로 올바르지 않습니다
는 내가 지금 가지고하는 것 같습니다? 내가 틀리지 않는 경우
''''''을 결합하지 않은 규칙적인 "첫 번째" '가치있는'모노 노드가 아닙니까? Haskell 언어에서 OP는'liftA2 mappend '를 찾고 있습니다. 즉'Option'이 적용 가능한 functor 또는 'mappend'를 들어 올리는 모나드라는 사실을 사용할 수 있습니다. Scala를 더 잘 알기를 바랍니다. – luqui
@luqui 미안하지만, 나는 처음 무엇인지 이해하지 못한다. 어떤 가치 monoid. 만약 내가 'Option'이 무료 monoid (예를 들어 List)라고 오해하지 않는다면 실제 타입이 monoid (즉, T : Monoid)가되어야하기 때문에 두 arg가 모두 'Some'이고'mappend'를 적용하면 – 4lex1v
아 - 예 - 물론 옵션 [T] 자체에는 Monoid가 있습니다! – PlexQ