Scala Language
모나드
수색…
모나드 정의
비공식적으로, 모나드는 F[_]
로 표기된 요소의 컨테이너로 flatMap
(이 컨테이너를 변형)과 unit
(이 컨테이너를 생성하기 위해)의 두 가지 함수로 채워져 있습니다.
일반적인 라이브러리 예제에는 List[T]
, Set[T]
및 Option[T]
있습니다.
형식 정의
Monad M
은 flatMap
과 unit
flatMap
두 가지 연산을 사용하는 파라 메트릭 유형 M[T]
입니다.
trait M[T] {
def flatMap[U](f: T => M[U]): M[U]
}
def unit[T](x: T): M[T]
이 함수는 세 가지 법칙을 충족해야합니다.
- 연관성 :
(m flatMap f) flatMap g = m flatMap (x => f(x) flatMap g)
즉, 순서가 변경되지 않은 경우 용어를 임의의 순서로 적용 할 수 있습니다. 따라서m
을f
에 적용한 다음 결과를g
적용하면f
를g
에 적용한 다음m
을 해당 결과에 적용하는 것과 같은 결과를 얻게됩니다. - 왼쪽 단위 :
unit(x) flatMap f == f(x)
즉,f
에 걸쳐 플랫 매핑 된x
의 단위 모나드는f
에x
를 적용하는 것과 같습니다. - 오른쪽 단위 :
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
- 연관성 :
(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)
- 왼쪽 단위
unit(x).flatMap(x => f(x)) == f(x)
List(1).flatMap(x => x * x) == 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