Scala 为什么我可以在函数上使用map?
我不明白为什么这段代码会编译:Scala 为什么我可以在函数上使用map?,scala,Scala,我不明白为什么这段代码会编译: def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f 如果我这样做: val f: Int => Double = _.toDouble 然后lift(f)工作正常,但是f map f给出了一个错误:错误:值映射不是Int=>Double的成员lif
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
如果我这样做:
val f: Int => Double = _.toDouble
然后
lift(f)
工作正常,但是f map f
给出了一个错误:错误:值映射不是Int=>Double
的成员lift
函数只是将您的函数f:a=>B
提升到某个其他域上的函数,在这种情况下它是选项[\u]
。因此,lift
的实现为您提供了一个函数f':Option[a]=>Option[B],并且由于Option具有map
函数,您可以在第一个输入参数上调用它(这是“下划线”)
您不必调用f map f
。您要做的是提升f函数:
val f: Int => Double = _.toDouble
val lifted = lift(f)
lifted(Some(42)) //it should be Some(42.0)
lift
函数只是将您的函数f:A=>B
提升到某个其他域上的函数,在这种情况下,它是选项[\u]
。因此,lift
的实现为您提供了一个函数f':Option[a]=>Option[B],并且由于Option具有map
函数,您可以在第一个输入参数上调用它(这是“下划线”)
您不必调用f map f
。您要做的是提升f函数:
val f: Int => Double = _.toDouble
val lifted = lift(f)
lifted(Some(42)) //it should be Some(42.0)
我不明白为什么这段代码会编译:
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
它是
def lift[A,B](f: A => B): Option[A] => Option[B] = (o: Option[A]) => o map f
方法lift
返回一个函数:-采用
选项[A]
-使用某些函数修改该选项的内容
f:A=>B
-返回结果,
选项[B]
所以,当你“提升”某个函数时,你基本上把它从A=>B
升级到Option[A]=>Option[B]
。当这个新升级的函数被赋予o:Option[A]
时,它会将该选项的内容映射到Option[B]
(通过使用升级原始函数时提供的f:A=>B
)
如果我这样做:
val f: Int => Double = _.toDouble
然后lift(f)工作正常,但f map f给出了一个错误error:value map>不是Int=>Double的成员
是的,因为您无法映射函数。您只能使用函数映射某个对象(顺便说一下,可以映射的对象称为函子)
您要做的是:
定义一些函数f(您定义了valf:Int=>Double=.\toDouble
)
使用lift将函数f从Int=>Double
升级到Option[Int]=>Option[Double]
使用新升级的函数映射选项[Int]
,从而将其转换为选项[Double]
因此:
我不明白为什么这段代码会编译:
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f
它是
def lift[A,B](f: A => B): Option[A] => Option[B] = (o: Option[A]) => o map f
方法lift
返回一个函数:
-采用选项[A]
-使用某些函数修改该选项的内容f:A=>B
-返回结果,选项[B]
所以,当你“提升”某个函数时,你基本上把它从A=>B
升级到Option[A]=>Option[B]
。当这个新升级的函数被赋予o:Option[A]
时,它会将该选项的内容映射到Option[B]
(通过使用升级原始函数时提供的f:A=>B
)
如果我这样做:
val f: Int => Double = _.toDouble
然后lift(f)工作正常,但f map f给出了一个错误error:value map>不是Int=>Double的成员
是的,因为您无法映射函数。您只能使用函数映射某个对象(顺便说一下,可以映射的对象称为函子)
您要做的是:
定义一些函数f(您定义了valf:Int=>Double=.\toDouble
)
使用lift将函数f从Int=>Double
升级到Option[Int]=>Option[Double]
使用新升级的函数映射选项[Int]
,从而将其转换为选项[Double]
因此:
lift(f)
相当于函数(x:T)=>x映射f
lift(f)
相当于函数(x:T)=>x映射f