map2 in scala in异常处理

2ekbmq32  于 7个月前  发布在  Scala
关注(0)|答案(3)|浏览(61)
def map[B] (f: A=>B) : Option[B]

def flatMap[B] (f: A=>Option[B]) : Option[B] 

def map2[A,B,C] (ao: Option[A], bo: Option[B]) (f: (A,B) => C) :Option[C] =
ao.flatMap(aa=>
  bo.map(bb=>
    (f(aa,bb))))

字符串
这里是异常处理中map和flatMap的定义,我在map和flatMap的基础上形成了这个map2。map2的形成真的很难理解。有人能解释一下flatMap和map在map2中的作用吗?谢谢

svgewumm

svgewumm1#

Option是一个Monad,在简化的方式下,它可以被看作是一个保存一些值的通用容器。
map是一个转换操作,它允许你使用简单的函数在“原始”类型上转换monad中的值。
flatMap类似于map,但更复杂一点:它允许你使用一个函数来转换monad内部的值,该函数接受“原始”值,但返回同一monad的一个示例,结果仍然是Monad[B],而不是map生成的Monad[Monad[B]]。换句话说,flatMap“转换”了结果。
map2是什么意思它接受Option monad的两个示例和一个函数,该函数将“原始”类型对转换为一个新的“原始”类型,并返回该结果类型的Option。逻辑上这类似于map,但要实现它,您需要一个flatMap。要调用您的f,您需要“unpack”aobo。但是monad并没有提供一种方法来“解包”原始值。你可能只想使用map。毕竟map2在逻辑上与它相似!但是,如果你写

ao.map(aa =>
  bo.map(bb => f(aa,bb)))

字符串
因为bo.map(bb => f(aa,bb))返回的是Option[C],(记住,没有标准的方法来“解包”monad),因此传递给ao.map(aa => ...)的函数返回Option[C],因此结果将是Option[Option[C]]。但这正是flatMap来拯救的地方!它允许您将这个双Option“解包”为一个简单的Option[C]
显然,这种解释是相当天真的,但我希望它能帮助你得到一些关于发生了什么的直觉。

2jcobegt

2jcobegt2#

如果你使用for-comprehension添加一些语法糖,它突然变得更容易阅读,如果你问我:

def map2[A,B,C] (ao: Option[A], bo: Option[B])(f: (A,B) => C): Option[C] = for {
  a <- ao
  b <- bo
} yield f(a,b)

字符串
基本上,我们想提取两个选项的ab,然后应用函数f得到CflatMap允许我们这样做,通过使用从AOption[B]的函数。map然后允许我们应用我们的函数f来将(A,B)变换为C

v8wbuo2f

v8wbuo2f3#

我从结果中一步步地思考这样的事情。
首先,你知道你最终想要一个A类型的值和一个B类型的值传递给函数f。
A从何而来?我们可以通过Mapoa来访问它。
我们可以把A和做同样的得到B。Map到ob上给我们一个B。
如果你在IDE中输入这个,你会看到一个类型错误,你有一个选项选项而不是一个选项。
这是因为第一个map将其响应 Package 为一个选项,但内部map也是如此。因此,通过将外部map更改为flatMap,您可以再次使其变平。

相关问题