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的形成。有人可以在map2中解释flatMap和map的作用。谢谢
答案 0 :(得分:2)
如果你使用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)
基本上,我们要提取两个选项的a
和b
,然后应用我们的函数f
来获取C
。 flatMap
允许我们通过使用A
到Option[B]
的函数来实现这一目标。 map
然后我们可以应用我们的函数f
将(A,B)
转换为C
。
答案 1 :(得分:2)
这是解释它的另一种尝试。 Option
是Monad,它以简化的方式被视为包含某些值的通用容器。
map
是一个转换操作,允许您使用&#34; raw&#34;上的简单函数转换monad中的值。类型。
flatMap
与map
类似,但有点复杂:它允许您使用接受&#34; raw&#34;的函数转换monad中的值。 value但返回相同monad的实例,结果只得Monad[B]
而不是Monad[Monad[B]]
生成的map
。换句话说,flatMap
&#34;变平&#34;结果。
那么你的map2
现在做了什么?它接受2个Option
monad实例和一个转换&#34; raw&#34;将一对类型分成一个新的&#34; raw&#34;输入并返回该结果类型的Option
。从逻辑上讲,这与map
类似,但要实现它,您需要flatMap
。要致电您的f
,您需要打开&#34;打开包装#34; ao
和bo
。但monad并没有提供一种方法来解开&#34; unpack&#34;原始价值。您可能只想使用map
。毕竟map2
在逻辑上与它相似!但是,如果你写
ao.map(aa =>
bo.map(bb => f(aa,bb)))
正如你可能天真地做的那样,它不会像你期望的那样工作。原因是bo.map(bb => f(aa,bb))
返回Option[C]
(请记住,没有标准方法来解压&#34; monad),因此传递给ao.map(aa => ...)
的函数返回{{1}因此结果将是Option[C]
。但这恰好是Option[Option[C]]
拯救的地方!它允许你解压缩&#34;将此flatMap
加倍到一个简单的Option
。
显然这种解释很天真,但我希望它会帮助你对发生的事情有所了解。