Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 为什么我可以在函数上使用map?_Scala - Fatal编程技术网

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