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中的作用吗?谢谢
3条答案
按热度按时间svgewumm1#
Option
是一个Monad,在简化的方式下,它可以被看作是一个保存一些值的通用容器。map
是一个转换操作,它允许你使用简单的函数在“原始”类型上转换monad中的值。flatMap
类似于map
,但更复杂一点:它允许你使用一个函数来转换monad内部的值,该函数接受“原始”值,但返回同一monad的一个示例,结果仍然是Monad[B]
,而不是map
生成的Monad[Monad[B]]
。换句话说,flatMap
“转换”了结果。map2
是什么意思它接受Option
monad的两个示例和一个函数,该函数将“原始”类型对转换为一个新的“原始”类型,并返回该结果类型的Option
。逻辑上这类似于map
,但要实现它,您需要一个flatMap
。要调用您的f
,您需要“unpack”ao
和bo
。但是monad并没有提供一种方法来“解包”原始值。你可能只想使用map
。毕竟map2
在逻辑上与它相似!但是,如果你写字符串
因为
bo.map(bb => f(aa,bb))
返回的是Option[C]
,(记住,没有标准的方法来“解包”monad),因此传递给ao.map(aa => ...)
的函数返回Option[C]
,因此结果将是Option[Option[C]]
。但这正是flatMap
来拯救的地方!它允许您将这个双Option
“解包”为一个简单的Option[C]
。显然,这种解释是相当天真的,但我希望它能帮助你得到一些关于发生了什么的直觉。
2jcobegt2#
如果你使用
for-comprehension
添加一些语法糖,它突然变得更容易阅读,如果你问我:字符串
基本上,我们想提取两个选项的
a
和b
,然后应用函数f
得到C
。flatMap
允许我们这样做,通过使用从A
到Option[B]
的函数。map
然后允许我们应用我们的函数f
来将(A,B)
变换为C
。v8wbuo2f3#
我从结果中一步步地思考这样的事情。
首先,你知道你最终想要一个A类型的值和一个B类型的值传递给函数f。
A从何而来?我们可以通过Mapoa来访问它。
我们可以把A和做同样的得到B。Map到ob上给我们一个B。
如果你在IDE中输入这个,你会看到一个类型错误,你有一个选项选项而不是一个选项。
这是因为第一个map将其响应 Package 为一个选项,但内部map也是如此。因此,通过将外部map更改为flatMap,您可以再次使其变平。