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