Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常处理中scala中的map2_Scala_Functional Programming - Fatal编程技术网

异常处理中scala中的map2

异常处理中scala中的map2,scala,functional-programming,Scala,Functional Programming,下面是异常处理中map和flatMap的定义,我在map和flatMap的基础上形成了这个map2。很难理解map2的形成。有人能解释一下flatMap和map在map2中的作用吗。谢谢你如果你为了理解而使用添加一些语法糖分如果你问我,它会突然变得更容易阅读: 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],

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

如果你为了理解而使用
添加一些语法糖分
如果你问我,它会突然变得更容易阅读:

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))))
defmap2[A,B,C](ao:Option[A],bo:Option[B])(f:(A,B)=>C):Option[C]=for{

这里是另一个解释它的尝试。
选项
是一个简化的容器,它可以被看作是一个包含一些值的通用容器

map
是一种转换操作,允许您使用“原始”类型的简单函数转换monad中的值

flatMap
map
类似,但有点复杂:它允许您使用一个函数来转换monad中的值,该函数接受“原始”值,但返回同一个monad的实例,结果仍然是只得到一个
monad[B]
而不是
monad[B]]
将由
映射生成的
。换句话说
平面映射
“展平”结果

那么现在您的
map2
做什么呢?它接受
Option
monad的两个实例和一个将“原始”类型对转换为单个新“原始”类型的函数键入并返回该结果类型的
选项
。从逻辑上讲,这类似于
映射
,但要实现它,您需要一个
平面映射
。要调用
f
,您需要同时“解包”
ao
bo
。但monad不提供一种仅“解包”的方法原始值。您可能只想使用
map
。毕竟
map2
在逻辑上与之类似!但是,如果您编写

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)
正如您可能天真地做的那样,它不会像您预期的那样工作。原因是
bo.map(bb=>f(aa,bb))
返回
Option[C]
(请记住,没有标准的方法“解包”monad),因此您的函数传递给
ao.map(aa=>…)
返回
Option[C]
,因此结果将是
Option[Option[C]]
。但这正是
flatMap
解救的地方!它允许您将这个双重
选项
解包成一个简单的
选项[C]


显然,这个解释很幼稚,但我希望它能帮助您对发生的事情有一些直觉。

是的,我知道这一点是为了理解,但我想知道使用flatMap和map背后的过程,因为编译器最终会将绑定分解为flapMap调用,最终绑定和产量转换为map调用是吗?是的,确切地说,
for
会被分解成
flatMap
map
。我不确定你的问题是什么。你是在问为什么要使用这两个函数吗?我问这个问题是因为我还是scala的新手。你为什么要写(f:(a,B)=>C)我的意思是,为什么它不像->(ao:Option[A],bo:Option[B],f:(A,B)=>C):Option[C]=…这是因为Scala类型推断。如果只使用一个参数列表,Scala无法推断函数的类型
f
。这是使用Scala进行函数编程的练习吗?
ao.map(aa =>
  bo.map(bb => f(aa,bb)))