수색…


모나드 정의

비공식적으로, 모나드는 F[_] 로 표기된 요소의 컨테이너로 flatMap (이 컨테이너를 변형)과 unit (이 컨테이너를 생성하기 위해)의 두 가지 함수로 채워져 있습니다.

일반적인 라이브러리 예제에는 List[T] , Set[T]Option[T] 있습니다.

형식 정의

Monad MflatMapunit flatMap 두 가지 연산을 사용하는 파라 메트릭 유형 M[T] 입니다.

trait M[T] {
  def flatMap[U](f: T => M[U]): M[U]
}

def unit[T](x: T): M[T]

이 함수는 세 가지 법칙을 충족해야합니다.

  1. 연관성 : (m flatMap f) flatMap g = m flatMap (x => f(x) flatMap g)
    즉, 순서가 변경되지 않은 경우 용어를 임의의 순서로 적용 할 수 있습니다. 따라서 mf 에 적용한 다음 결과를 g 적용하면 fg 에 적용한 다음 m 을 해당 결과에 적용하는 것과 같은 결과를 얻게됩니다.
  2. 왼쪽 단위 : unit(x) flatMap f == f(x)
    즉, f 에 걸쳐 플랫 매핑 된 x 의 단위 모나드는 fx 를 적용하는 것과 같습니다.
  3. 오른쪽 단위 : m flatMap unit == m
    이것은 '정체성'입니다 : 유닛에 대해 평면으로 매핑 된 모든 모나드는 자신과 동일한 모나드를 반환합니다.

:

val m = List(1, 2, 3)
def unit(x: Int): List[Int] = List(x)
def f(x: Int): List[Int] = List(x * x)
def g(x: Int): List[Int] = List(x * x * x)
val x = 1
  1. 연관성 :
(m flatMap f).flatMap(g) == m.flatMap(x => f(x) flatMap g) //Boolean = true
//Left side:
List(1, 4, 9).flatMap(g) // List(1, 64, 729)
//Right side:
 m.flatMap(x => (x * x) * (x * x) * (x * x)) //List(1, 64, 729)

  1. 왼쪽 단위
unit(x).flatMap(x => f(x)) == f(x)
List(1).flatMap(x => x * x) == 1 * 1

  1. 오른쪽 단위
//m flatMap unit == m
m.flatMap(unit) == m
List(1, 2, 3).flatMap(x => List(x)) == List(1,2,3) //Boolean = true

표준 컬렉션은 모나드입니다.

표준 컬렉션의 대부분은 모나드 ( List[T] , Option[T] ) 또는 모나드 유사 ( Either[T] , Future[T] )입니다. 이러한 컬렉션은 서로 쉽게 결합 될 수 내에 for (기입 동등한 방법 지능형 flatMap 변형)

val a = List(1, 2, 3)
val b = List(3, 4, 5)
for {
  i <- a
  j <- b
} yield(i * j)

위 내용은 다음과 같습니다.

a flatMap {
  i => b map {
    j => i * j
  }
}

모나드는 데이터 구조를 보존하고 해당 구조 내의 요소에만 작용하기 때문에 여기서 이해할 수 있도록 모나드 데이터 구조를 끝없이 연결할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow