我不明白为什么scala需要我有时将args命名为anon fns:
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)
答案 0 :(得分:4)
答案在错误信息中,但是加密:
(x$1) => x$1.name
等等,什么?你想要x$1 => reverseString(x$1.name)
。
所以现在你看到到底出了什么问题:它假设函数是里面 reverseString
parens(即你想将函数传递给reverseString
)。通过明确命名变量,您可以证明它是错误的。
(它给出了该消息,因为一旦假定reverseString
应该传递一个函数,它就不知道要使该函数成为什么类型,因为reverseString
实际上想要一个字符串,而不是一个函数。 )
答案 1 :(得分:0)
我相信这就是所谓的类型推断。此外,_只是一个占位符。 (你已经将p定义为Some [Person]类型,所以编译器足够聪明,可以按照你的方式计算出来)