Scala Language
モナド
サーチ…
モナド定義
非形式的には、モナドはflatMap
(このコンテナを変換する)とunit
(このコンテナを作成する)の2つの関数でパックされたF[_]
と表記された要素のコンテナです。
共通ライブラリの例には、 List[T]
、 Set[T]
、 Option[T]
ます。
正式な定義
Monad M
は、 flatMap
とunit
2つの演算を持つパラメトリック型 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
標準コレクションはMonadsです
標準コレクションのほとんどは、モナド( List[T]
、 Option[T]
)、またはモナドのようなもの( Either[T]
、 Future[T]
)です。これらのコレクションはfor
内包のfor
に簡単に一緒にflatMap
ことができます(これは、 flatMap
変換の同等の書き方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