3

我不明白为什么 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)
4

2 回答 2

4

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

(x$1) => x$1.name

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

所以现在您确切地看到出了什么问题:它假定函数括号内(即reverseString您想将函数传递给reverseString)。通过显式命名变量,您可以向它证明它是错误的。

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

于 2012-10-04T19:33:41.233 回答
0

我相信这就是所谓的类型推断。此外, _ 只是一个占位符。(您已经将 p 定义为 Some[Person] 类型,因此编译器足够聪明,可以在按照您的方式使用时弄清楚)

于 2012-10-04T19:31:58.123 回答