Scala 中的 Monad
在 Scala 中, Monads是一种执行连续计算的结构。它是覆盖另一个对象的对象。值得注意的是,这里某个步骤的操作的输出是另一个计算的输入,它是所述程序最近步骤的父级。 Monad既不是类也不是特征,它是一个概念。 Scala 的最大集合是Monad ,但并非所有Monad都是集合,有几个Monad是容器,如 Scala 中的Options 。简而言之,我们可以说,在 Scala 中,实现map以及flatMap()的数据类型(如 Options、Lists 等)称为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时,将返回一个列表,其中删除了内部分组并生成了一个序列。
注意:支持map和flatMap的集合称为monadic 。现在,让我们看一些 Scala 中的Monad示例。
支持map和flatMap的集合示例。
例子 :
// Scala program of Monads
// Creating object
object GfG
{
// Main method
def main(args:Array[String])
{
// Creating list of numbers
val list1 = List(1, 2, 3, 4)
val list2 = List(5, 6, 7, 8)
// Applying 'flatMap' and 'map'
val z = list1 flatMap { q => list2 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)
现在让我们看看如何计算输出。
// Applying map() we get list like below
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)), List((4+5), (4+6), (4+7), (4+8)))
经过评估我们得到,
List(List(6, 7, 8, 9), List(7, 8, 9, 10), List(8, 9, 10, 11), List(9, 10, 11, 12))
所以,我们得到一个列表列表,并且在应用map()之后,对于每个操作我们都有一个不同的列表,现在让我们应用flatMap() 。
// Applying flatMap() we get a list like below
List(6, 7, 8, 9, 7, 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) 那么现在让我们看看如何计算输出。
// Applying map() we get list like below
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)
因此,内部分组被删除。