Scala Monads用法详细解读和指南

2021年5月3日16:46:02 发表评论 981 次浏览

Scala中,Monads是一个执行连续计算的构造。它是一个覆盖另一个对象的对象。这里值得注意的是,某个步骤的操作输出是另一个计算的输入,这是所述程序的最近步骤的父步骤。Monads既不是一个类也不是一个特征,它是一个概念。Scala的最大集合是Monads,但不是所有的Monads都是集合,有几个Monads是像Scala中的选项一样的容器。简而言之,我们可以说,在Scala中,实现map和flatMap()的数据类型,如选项,列表等,被称为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在上面提到的序列上应用, 然后返回列表, 在其中删除内部分组并生成序列。

注意:支持的集合地图以及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)

因此, 内部分组被删除。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: