📜  Scala 中的 Monad

📅  最后修改于: 2022-05-13 01:55:07.153000             🧑  作者: Mango

Scala 中的 Monad

在 Scala 中, Monads是一种执行连续计算的结构。它是覆盖另一个对象的对象。值得注意的是,这里某个步骤的操作的输出是另一个计算的输入,它是所述程序最近步骤的父级。 Monad既不是类也不是特征,它是一个概念。 Scala 的最大集合是Monad ,但并非所有Monad都是集合,有几个Monad是容器,如 Scala 中的Options 。简而言之,我们可以说,在 Scala 中,实现map以及flatMap()的数据类型(如 Options、Lists 等)称为Monads

Monads提供的操作

这些对象包含在Monads中,因为它产生以下两个函数:

  1. unit() :类似于Java中的 void,它不返回任何数据类型。
  2. 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时,将返回一个列表,其中删除了内部分组并生成了一个序列。

注意:支持mapflatMap的集合称为monadic 。现在,让我们看一些 Scala 中的Monad示例。

支持mapflatMap的集合示例。
例子 :

// 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)

现在让我们看看如何计算输出。

经过评估我们得到,

所以,我们得到一个列表列表,并且在应用map()之后,对于每个操作我们都有一个不同的列表,现在让我们应用flatMap()

因此,当我们应用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) 那么现在让我们看看如何计算输出。

经过评估,我们得到,

现在,让我们应用 flatMap()。

// Applying flatMap() we get a list like below
List(1, 3, 5, 7, 2, 6, 10, 14, 3, 9, 15, 21)

因此,内部分组被删除。