为什么scala有时需要匿名函数中命名的参数?

为什么scala有时需要匿名函数中命名的参数?,scala,Scala,我不明白为什么scala有时需要我给anon fns命名args: scala> case class Person(name: String) defined class Person scala> def reverseString(s: String) = s.reverse reverseString: (s: String)String scala> val p = Some(Person("foo")) p: Some[Person] = Some(Person

我不明白为什么scala有时需要我给anon fns命名args:

scala> case class Person(name: String)
defined class Person

scala> def reverseString(s: String) = s.reverse
reverseString: (s: String)String

scala> val p = Some(Person("foo"))
p: Some[Person] = Some(Person(foo))

scala> p map { reverseString(_.name) }
<console>:12: error: missing parameter type for expanded function ((x$1) => x$1.name)
              p map { reverseString(_.name) }

// why does it only work when I name the argument? I'm not even telling it the type.
scala> p map { p => reverseString(p.name) }
res9: Option[String] = Some(oof)

// and shouldn't this fail too?
scala> p map { _.name.reverse }
res13: Option[String] = Some(oof)
scala>案例类人物(姓名:String)
限定类人
scala>def reverseString(s:String)=s.reverse
反向字符串:(s:String)String
scala>val p=Some(Person(“foo”))
p:Some[人]=Some(人(foo))
scala>p映射{reverseString(uz.name)}
:12:错误:缺少扩展函数的参数类型((x$1)=>x$1.name)
p映射{reverseString(uu.name)}
//为什么只有在我命名论点时它才起作用?我甚至没有告诉它类型。
scala>p映射{p=>reverseString(p.name)}
res9:Option[String]=Some(oof)
//这不也应该失败吗?
scala>p映射{{uu.name.reverse}
res13:选项[String]=Some(oof)

我相信这就是所谓的类型推断。而且,uu只是一个占位符。(您已经将p定义为type Some[Person],因此编译器足够聪明,可以在使用您的方式时找到答案)

答案在错误消息中,但神秘地是这样的:

(x$1) => x$1.name
等等,什么?您需要
x$1=>reverseString(x$1.name)

现在您可以清楚地看到出了什么问题:它假设函数在
反向字符串
参数中(即,您希望将函数传递给
反向字符串
)。通过显式命名变量,您可以向它证明它是错误的


(它给出了这个消息,因为一旦它假设
reverseString
应该传递一个函数,它就不知道该函数的类型,因为
reverseString
实际上需要一个字符串,而不是一个函数。)

那么为什么它不首先扩展到
x$1=>reverseString(x$1.name)
?在这个例子中:
valdouble=(x:Int)=>x*2;val double=1到5映射{double()}
不会扩展为
(Int=>Int)
并失败,因为
double
需要
Int
?@devth-否,因为
单独作为参数意味着“部分应用”(即,使用此方法创建一个函数,将任何未应用的参数作为参数),而部分应用的函数(包含整个参数列表)就是该函数。执行任何更复杂的操作,如
double(*2)
它也会因为同样的原因失败。啊,这是有道理的。那么关于我的另一个问题-为什么Scala不扩展到更合理的
x$1=>反向限制(x$2.name)?有没有这样的假设?“Deth-----我认为这是编译的一个因素已经很慢了,而且规范文档和代码所需要的是非平凡的(特别是当你考虑多个嵌套时,程序员要跟踪的程序太多了)。在某些情况下,与其计算越来越疯狂的推测分支,不如让程序员澄清一下。可能的重复