异常处理中的scala中的map2

时间:2017-05-27 13:21:56

标签: scala functional-programming

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的作用。谢谢

2 个答案:

答案 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)

基本上,我们要提取两个选项的ab,然后应用我们的函数f来获取CflatMap允许我们通过使用AOption[B]的函数来实现这一目标。 map然后我们可以应用我们的函数f(A,B)转换为C

答案 1 :(得分:2)

这是解释它的另一种尝试。 OptionMonad,它以简化的方式被视为包含某些值的通用容器。

map是一个转换操作,允许您使用&#34; raw&#34;上的简单函数转换monad中的值。类型。

flatMapmap类似,但有点复杂:它允许您使用接受&#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; aobo。但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

显然这种解释很天真,但我希望它会帮助你对发生的事情有所了解。