在Scala中,Monads是一个执行连续计算的构造。它是一个覆盖另一个对象的对象。这里值得注意的是,某个步骤的操作输出是另一个计算的输入,这是所述程序的最近步骤的父步骤。Monads既不是一个类也不是一个特征,它是一个概念。Scala的最大集合是Monads,但不是所有的Monads都是集合,有几个Monads是像Scala中的选项一样的容器。简而言之,我们可以说,在Scala中,实现map和flatMap()的数据类型,如选项,列表等,被称为Monads。
Monads提供的操作
这些对象用Monads因为它产生以下两个功能:
- unit():就像Java中的void一样, 它不返回任何数据类型。
- flatMap():它与Scala中的map()相似, 但是它返回一系列而不是返回单个组件。
让我们看一个示例来明确说明它。
var x = Seq("Geeks", "For", "Geeks")
让我们在给定的序列上应用map()。
//Applying map()
var y = x.map(_.toUpperCase)
//Output
List(GEEKS, FOR, GEEKS)
现在, 让我们在给定的序列上应用flatMap()。
//Applying flatMap()
var z = x.flatMap(_.toUpperCase)
//Output
List(G, E, E, K, S, F, O, R, G, E, E, K, S)
所以, 当flatMap在上面提到的序列上应用, 然后返回列表, 在其中删除内部分组并生成序列。
注意:支持的集合地图以及flatMap被称为Monads。现在, 让我们看一些例子Monads在Scala。
支持map和flatMap的例子。
示例:
//Scala program of Monads
//Creating object
object GfG
{
//Main method
def main(args : Array[String])
{
//Creating list of numbers
val list 1 = List( 1 , 2 , 3 , 4 )
val list 2 = List( 5 , 6 , 7 , 8 )
//Applying 'flatMap' and 'map'
val z = list 1 flatMap { q => list 2 map {
r => q + r
}
}
//Displays output
println(z)
}
}
输出如下:
List(6, 7, 8, 9, 7, 8, 9, 10, 8, 9, 10, 11, 9, 10, 11, 12)
现在, 我们来看看如何计算输出。
//应用map()我们得到如下列表
List(List((1 + 5), (1 + 6), (1 + 7), (1 + 8)), List((2 + 5), (2 +6), (2 + 7), (2 + 8)),
List((3 + 5), (3 + 6), (3 + 7), (3 + 8)), 列表((4 + 5) ), (4 + 6), (4 + 7), (4 + 8)))
经过评估我们得到
List(List(6, 7, 8, 8), List(7, 8, 9, 10), List(8, 9, 10, 11), List(9, 10, 11, 12))
因此, 我们得到一个列表列表, 对于每个操作, 应用后我们都有一个不同的列表地图(), 现在让我们申请flatMap().
//应用flatMap()我们将得到一个类似于
List(6, 7, 8, 9, 7, 8, 8, 9, 10, 8, 9, 10, 11, 9, 10, 11, 12)的列表
所以, 当我们申请flatMap()内部分组被删除。
示例:
//Scala program of Monads
//Creating object
object GfG
{
//Main method
def main(args : Array[String])
{
//Creating list of numbers
val x = ( 1 to 3 ).toList
val y = ( 1 to 7 by 2 ).toList
//Applying 'flatMap'and 'map'
val z = x flatMap { s => y map {
t => s * t
}
}
//Displays output
println(z)
}
}
输出如下:
List(1, 3, 5, 7, 2, 6, 10, 14, 3, 9, 15, 21)
在这里, List(x)=(1、2、3)和List(y)=(1、3、5、7), 然后让我们看看如何计算输出。
//应用map()我们得到如下列表
List(List((1 * 1), (1 * 3), (1 * 5), (1 * 7)), List((2 * 1), (2 * 3), (2 * 5), (2 * 7)),
List((3 * 1), (3 * 3), (3 * 5), (3 * 7)))
经过评估, 我们得到了
List(List(1、3、5、7), List(2、6、10、14), List(3、9、15、21))
现在, 让我们应用flatMap()。
//Applying flatMap() we get a list like below
List(1, 3, 5, 7, 2, 6, 10, 14, 3, 9, 15, 21)
因此, 内部分组被删除。